powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / SQL to LINQ group/join/distinct
6 сообщений из 6, страница 1 из 1
SQL to LINQ group/join/distinct
    #39165197
Vanovich
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Приветствую, коллеги.
Уже достаточно долго бьюсь над реализацией запроса в 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
SQL to LINQ group/join/distinct
    #39165322
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vanovich
Код: c#
1.
context.ActCustomerPlaces.Where(x => act.Id == x.ActId).DefaultIfEmpty()

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

Код: 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
SQL to LINQ group/join/distinct
    #39165334
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
но, пожалуй, стоит завести свойства навигации ActCustomerPlaces и ActGroupWeights у сущности Act, чтобы не городить каждый раз такие огороды
...
Рейтинг: 0 / 0
SQL to LINQ group/join/distinct
    #39165457
Vanovich
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо тебе, добрый человек!
Действительно, использование свойств навигации решило проблему.
Добавил .Include("ИмяСвойства") для каждой левой таблицы.
...
Рейтинг: 0 / 0
SQL to LINQ group/join/distinct
    #39165463
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1) Include в данном случае (в одном запросе) использовать необязательно, все равно на выходе проекция
2) в случае необходимости использования Include, лучше подключить System.Data.Entity и использовать более новую версию Include: .Include(n => n.ИмяСвойства)
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / SQL to LINQ group/join/distinct
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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