在DB2 LUW 9.7数据库上使用FluentNhibernate 1.3.0.0,NHibernate 3.3.1.4000。

我只想从一个表/实体中获取一些不同的数据。在SQL中,这很简单:

select distinct Corporation, CalculationDate, ValuationRule
from MySchema.MyTable
where State == 0


现在,我正在尝试使用Linq获取这些数据,但是它将无法正常工作...

首先尝试使用select:

var result = Session.Query<MyEntity>()
        .Where( x => x.State == State.Pending)
        .Select(
           x =>
              new
              {
                 Corporation = x.Corporation,
                 CalculationDate = x.CalculationDate,
                 ValuationRule = x.ValuationRule,
              }).Distinct().ToList();


结果异常:此SelectClauseVisitor不支持表达式类型'NhDistinctExpression'。

第二次尝试,使用Groupby并仅获取密钥:

var result = Session.Query<MyEntity>()
        .Where( x => x.State == State.Pending)
        .GroupBy(
           x =>
              new
              {
                 Corporation = x.Corporation,
                 CalculationDate = x.CalculationDate,
                 ValuationRule = x.ValuationRule,
              }).Select( x => x.Key).ToList();


产生的异常:“无法执行查询”。选择字段中的group by子句中缺少另一个字段“ Model”的投诉。这完全让我感到困惑,因为表中存在指定的字段,但是我不想在该用例中使用该字段...

我想念的是什么?

最佳答案

Brenda的两个示例都缺少转换。

免责声明:首先检查DTO或Linq投影中的类型是否正确。

public class MyDto
{
    public string Corporation { get; set; }
    public DateTime? CalculationDate { get; set; }
    public string ValuationRule { get; set; }
}

MyDto myDto = null;

var result = Session.QueryOver<MyEntity>()
    .Where(x => x.State == State.Pending)
    .SelectList(list => list
        .Select(Projections.Distinct(Projections.Property<MyEntity>(x => x.Corporation))).WithAlias(() => myDto.Corporation)
        .Select(x => x.CalculationDate).WithAlias(() => myDto.CalculationDate)
        .Select(x => x.ValuationRule).WithAlias(() => myDto.ValuationRule)
        )
    .TransformUsing(Transformers.AliasToBean<MyDto>())
    //.TransformUsing(Transformers.AliasToBean<MyEntity>()) // You can use your entity but i recommend to use a DTO (Use MyEntity in the alias too)
    .ToList();


如果您不想使用转换器,则需要强制转换为obj数组:

var result = Session.QueryOver<MyEntity>()
    .Where(x => x.State == State.Pending)
    .SelectList(list => list
        .Select(Projections.Distinct(Projections.Property<MyEntity>(x => x.Corporation)))
        .Select(x => x.CalculationDate)
        .Select(x => x.ValuationRule)
        )
    .ToList<object[]>()
    //.Select(x => new    // This is optional to use anonymus type instead a object[]
    //      {
    //         Corporation = (string) x[0],
    //         CalculationDate = (DateTime?) x[1],
    //         ValuationRule = (string) x[2]
    //      })
    //.List()
    ;

关于c# - FluentNhibernate:查询以检索不同的值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29848421/

10-09 01:56