Преобразование T-SQL в Linq - PullRequest
1 голос
/ 24 июня 2011

Я использую Entitry Framework 4.1 и пытаюсь понять, как преобразовать приведенный ниже запрос, который использует соединения и методы агрегирования, в вызов Linq to Entities в DomainService.

SELECT     tblTime.Period As Timeline, COUNT(tblEngineeringDashboard_ItemList.ID) AS Items
FROM         tblEngineeringDashboard_ItemList INNER JOIN
                      tblTime ON tblEngineeringDashboard_ItemList.TimeID = tblTime.ID
GROUP BY tblTime.Period
ORDER BY tblTime.Period

Может ли кто-нибудь предоставить помощь?.

Возможное решение

Dim var = From i In ObjectContext.tblEngineeringDashboard_ItemList
                Join t In ObjectContext.tblTimes On i.TimeID Equals t.ID
                Group By i.TimeID Into Group
                Select DateStart = (From n In ObjectContext.tblTimes Where n.ID = TimeID Select n.Period), PartCount = Group.Count

Фил

Ответы [ 3 ]

1 голос
/ 24 июня 2011

Первое, что приходит на ум, это:

var q = from t in Context.Time
        group t by t.Period into g
        orderby g.Key
        select new 
        {
            Timeline = g.Key,
            Items = (from ti in g
                     from il in ti.ItemList // or whatever the property for the navigation to tblEngineeringDashboard_ItemList is called
                     select il).Count()
        };

Однако исходный SQL имел INNER JOIN, который отклонял бы tblTime записей без каких-либо соответствующих записей в tblEngineeringDashboard_ItemList. Так что вы можете захотеть:

var q = from t in Context.Time
        where t.ItemList.Any()
        group t by t.Period into g
        orderby g.Key
        select new 
        {
            Timeline = g.Key,
            Items = (from ti in g
                     from il in ti.ItemList // or whatever the property for the navigation to tblEngineeringDashboard_ItemList is called
                     select il).Count()
        };

Вы также можете перевернуть запрос:

var q = from i in Context.EngineeringDashboardItemList
        where i.Time != null 
        group i by i.Time.Period into g
        orderby g.Key
        select new 
        {
            Timeline = g.Key,
            Items = g.Count()
        };
0 голосов
/ 24 июня 2011

Хотя преобразование из sql в linq не является идеальным подходом (вам следует подумать непосредственно о linq, переводя свою потребность в запрос linq), отправленный вами запрос довольно прост.

var grouped = tblTime.OrderBy(c => c.Period).GroupBy(c => c.Period).Select(c =>
new {
       timeline = c.Key,
       count = c.SelectMany(x => x.tblEngineeringDashboard).Count()
    });

*Изменить: Там, исправлено.Все в движке L2E.

Это при условии, что между таблицами есть правильные внешние ключи (поэтому вам не нужно объявлять соединение вручную).

0 голосов
/ 24 июня 2011

Это работает?

tblEngineeringDashboard_ItemList
    .Join(tblTime,ed => ed.TimeID ,t => t.ID, (ed,t) => new{ed,t})
.GoupBy(g => g.t.Period)
.Select(s => new 
          {
           Timeline = s.Key,
           Items = s.Count()
          }
       )
.OrderBy(o => o.Timeline)
...