Гость
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / SQL to LINQ group/join/distinct / 6 сообщений из 6, страница 1 из 1
08.02.2016, 06:39
    #39165197
Vanovich
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL to LINQ group/join/distinct
Приветствую, коллеги.
Уже достаточно долго бьюсь над реализацией запроса в LINQ

Запрос на SQL выглядит так:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
SELECT t1.Id, t1.RegistryDate,
       count(distinct t2.Id) as PlacesCount,
       sum(distinct t2.Weight) as RealWeight,
       sum(distinct t3.Weight) as GroupWeight
FROM Acts as t1
left join ActCustomerPlaces as t2 on t2.ActId = t1.Id
left join ActGroupWeights as t3 on t3.ActId = t1.Id
group by t1.Id desc;



Никак не могу осилить 2 левых внешних объединения, да еще с Distinct по полям
Сам выдал следующее:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
var query = from act in context.Acts.AsNoTracking()
                            from t1 in context.ActCustomerPlaces.Where(x => act.Id == x.ActId).DefaultIfEmpty()
                            from t2 in context.ActGroupWeights.Where(x => act.Id == x.ActId).DefaultIfEmpty()
                            group new { act, t1, t2 } by act.Id into g
                            orderby g.Key descending
                            select new
                            {
                                Id = g.Key,
                                RegistryDate = g.FirstOrDefault().act.RegistryDate,
                                PlacesCount = g.Select(x => x.t1.Id).Distinct().Count(),
                                RealWeight = g.Distinct().Sum(x => x.t1.Weight),
                                GroupWeight = g.Distinct().Sum(x => x.t2.Weight)
                            };



Но увы, не работает. Вылетает эксепшн типа "Unkown column in where clause"
...
Рейтинг: 0 / 0
08.02.2016, 11:05
    #39165322
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL to LINQ group/join/distinct
Vanovich
Код: c#
1.
context.ActCustomerPlaces.Where(x => act.Id == x.ActId).DefaultIfEmpty()

указанное выражение является совершенно самостоятельным, оно не в контексте основного запроса, поэтому переменная act не находится в области его видимости
...
Рейтинг: 0 / 0
08.02.2016, 11:10
    #39165330
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL to LINQ group/join/distinct
левое объединение в текучем синтаксисе выглядит так

Код: c#
1.
2.
3.
4.
from act in context.Acts.AsNoTracking()
join t1 in context.ActCustomerPlaces
into acts
from act_t1 in acts.DefaultIfEmpty()
...
Рейтинг: 0 / 0
08.02.2016, 11:12
    #39165334
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL to LINQ group/join/distinct
но, пожалуй, стоит завести свойства навигации ActCustomerPlaces и ActGroupWeights у сущности Act, чтобы не городить каждый раз такие огороды
...
Рейтинг: 0 / 0
08.02.2016, 12:44
    #39165457
Vanovich
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL to LINQ group/join/distinct
Спасибо тебе, добрый человек!
Действительно, использование свойств навигации решило проблему.
Добавил .Include("ИмяСвойства") для каждой левой таблицы.
...
Рейтинг: 0 / 0
08.02.2016, 12:51
    #39165463
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL to LINQ group/join/distinct
1) Include в данном случае (в одном запросе) использовать необязательно, все равно на выходе проекция
2) в случае необходимости использования Include, лучше подключить System.Data.Entity и использовать более новую версию Include: .Include(n => n.ИмяСвойства)
...
Рейтинг: 0 / 0
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / SQL to LINQ group/join/distinct / 6 сообщений из 6, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]