структура сущности - как я могу реализовать этот SQL в сокращенном EF linq - PullRequest
3 голосов
/ 08 октября 2010

Может кто-нибудь помочь с тем, что код C # будет для реализации этого SQL как Entity Framework Linq в сокращенной форме?(например, где у вас есть нотация ".", такая как xxx.where (... и т.д.)

SELECT PN.Name, Sum(U.Amount)
FROM Usages as U, ProcessNames as PN
WHERE PN.Id == U.ProcessNameId 
   AND U.Datetime BETWEEN '2010-01-08' AND '2010-10-11'
Group By PN.Name

Ответы [ 2 ]

5 голосов
/ 08 октября 2010

Запрос на основе метода:
Чтобы реализовать это в лямбде, нам нужно использовать Queryable.GroupJoin :

var query = context.ProcessNames
    .GroupJoin(context.Usages
                      .Where(u => u.Datetime >= new DateTime(2010, 1, 8) ) 
                                  && u.Datetime <= new DateTime(2010, 10, 11),
               pn  => pn.Id,
               u => u.ProcessNameId, 
               (pn, usages) => new { Name = pn.Name, 
                                     Sum = usages.Sum(u => u.Amount) });


Выражение запроса:
И тот же запрос в синтаксисе выражения запроса:

var query = 
    from pn in context.ProcessNames
    join u in context.Usages
                     .Where(u => u.Datetime >= new DateTime(2010, 1, 8) ) 
                                 && u.Datetime <= new DateTime(2010, 10, 11),
    on pn.Id 
    equals u.ProcessNameId 
    into g                      
    select new { Name = pn.Name, 
                 Sum = g.Sum(u => u.Amount) };


Проверка сгенерированного SQL:
Чтобы убедиться, что эти запросы дают вам желаемую команду Sql во время выполнения, вы можете сделать это:

string sqlCommand = ((ObjectQuery)query).ToTraceString();


Дополнительные примеры:
Несколько хороших примеров для GroupJoinобратите внимание на следующие элементы:

Примеры синтаксиса запросов на основе методов: операторы соединения
Примеры синтаксиса выражений запроса: операторы соединения

1 голос
/ 08 октября 2010

Попробуйте это (у меня нет вашего кода, поэтому мне не нужна помощь компилятора):

from u in context.Usages
join pn in context.ProcessNames on pn.Id equals u.ProcessNameId
where u.Datetime >= new DateTime(2010, 1, 8) && u.Datetime <= new DateTime(2010, 10, 11)
group pn by pn.Name into g
select new { Name = pn.Name , sum = g.Sum(u => u.Amount) };

Это версия выражения запроса. Чтобы получить синтаксис на основе лямбды (как я полагаю, вы задаете этот вопрос), поместите запрос в LinqPad и запустите его. Затем нажмите на лямбда-вкладку в LinqPad, и он покажет вам этот синтаксис вышеупомянутого запроса, как если бы вы написали его с помощью лямбда-выражений (т. Е. Где у вас есть нотация "."), А не выражения запроса.

...