2015-04-24 3 views
2

Использование FluentNhibernate 1.3.0.0, NHibernate 3.3.1.4000 в базе данных DB2 LUW 9.7.FluentNhibernate: запрос для получения отдельных значений

Я хочу получить отдельные данные только из одной таблицы/сущности. В SQL подмигнул легко:

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

Теперь я пытаюсь получить эти данные с помощью Linq, но won't работы ...

Сначала попробуйте выбрать:

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(); 

Исходящее исключение: Тип выражения 'NhDistinctExpression' не поддерживается этим SelectClauseVisitor.

второй попытки, используя 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, которое указано в выбранном термине. Это меня совершенно сбивает с толку, поскольку указанное поле существует в таблице, но я не хочу использовать это поле в этом случае использования ...

Что мне не хватает?

ответ

4

В обоих примерах из 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() 
    ; 
5

Попробуйте использовать QueryOver ...

var result = Session.QueryOver<MyEntity>() 
    .Where(x => x.State == State.Pending) 
    .SelectList(list => list 
     .SelectGroup(x => x.Corporation) 
     .SelectGroup(x => x.CalculationDate) 
     .SelectGroup(x => x.ValuationRule)    
    ) 
    .ToList(); 

Если вы хотите использовать отчетливый:

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(); 
+1

Спасибо, я попробовал оба варианта. Оба бросают исключение «Невозможно выполнить поиск [SQL: SQL недоступно]». Внутреннее исключение (переведенное): «System.Object [] не является значением типа MyEntity и не может использоваться в этом общем листинге». – Udontknow

+1

Возможно, вам нужно передать в массив объектов '.ToList ' (http://stackoverflow.com/questions/13453156/nhibernate-query-to-select-count-of-grouped-by-rows) – BrennQuin

Смежные вопросы