powered by simpleCommunicator - 2.0.50     © 2025 Programmizd 02
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / помогите составить linq запрос
8 сообщений из 8, страница 1 из 1
помогите составить linq запрос
    #38922092
bald56rus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
всем доброго дня.

есть три таблицы:

Operations
Id ProductName Detail Description1 Узел1 Деталь1 Деталь12 Узел2 Деталь1 Деталь1

Programs
Id OperationId Name Description ActId1 1 Программа1 Программа112 1 Программа2 Программа213 2 Программа3 Программа34 1 Программа4 Программа425 1 Программа5 Программа52

Acts
Id Number Registered Archive1 01/01/001 2015/03/20 true2 01/01/002 2015/03/30 false

мне необходимо получить что то типа следующего:
IdProductNameDetailDescriptionActId1Узел1 Деталь1 Деталь1 22Узел2 Деталь1 Деталь1
связь следующаяя, для одной операции может быть несколько программ(у программы может быть активный акт) как мне получить список операций с указанием наличия действующего акта(act.archive=false). запросом к базе я бы сделал так:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
SELECT DISTINCT
  o.Detail,
  o.Description,
  ai.Act,
FROM Operations o
LEFT OUTER JOIN Programs p
  ON o.Id = p.OperationId
LEFT OUTER JOIN ActImplementations ai
  ON p.ActId = ai.Id
  AND ai.Archive = false



как сделать подобный запрос средствами Linq? заранее спасибо
P.S.: если же данная схема не правильна подскажите как сделать иначе.
...
Рейтинг: 0 / 0
помогите составить linq запрос
    #38922354
handmadeFromRu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: c#
1.
2.
3.
4.
5.
6.
var  res = dbContext.Programs.Where(x=>x.Acts.Any(y=>y.archive==false))
                                 .Select(x=> new { 
                                                            OperationsId =x.Operations.Id,
                                                            x.Operations.ProductName,
                                                            ActId = x.Acts.Id 
                                                          }).Distinct().ToList();


что то в таком духе. а про схему не зная предметную область лучше вряд ли что предложат
...
Рейтинг: 0 / 0
помогите составить linq запрос
    #38922366
Фотография Axeleron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bald56rus,
Не проверял, но примерно так:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
            var items = (from o in Operations
                         join p in Programs on o.Id equals p.OperationId into step1
                         from s1 in step1.DefaultIfEmpty()
                         join ai in ActImplementations on s1.ActId equals ai.Id into step2
                         from s2 in step2.DefaultIfEmpty()

                         select new
                         {
                             o.Detail,
                             o.Description,
                             ai.Act
                         }).Distinct();
...
Рейтинг: 0 / 0
помогите составить linq запрос
    #38922379
Фотография Axeleron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так поточнее (забыл where)
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
            var items = (from o in Operations
                         join p in Programs on o.Id equals p.OperationId into step1
                         from s1 in step1.DefaultIfEmpty()
                         join ai in ActImplementations on s1.ActId equals ai.Id into step2
                         from s2 in step2.DefaultIfEmpty()
                         where ai.Archive == false

                         select new
                         {
                             o.Detail,
                             o.Description,
                             ai.Act
                         }).Distinct();
...
Рейтинг: 0 / 0
помогите составить linq запрос
    #38922400
bald56rus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
спасибо откликнувшимся у меня получилось так
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
            IEnumerable<Operation> _operations = operationRepository.GetAllOperations();
            var operations=
                (from o in db.Operations
                join p in db.Programs on o.Id equals p.OperationId into t0
                from t1 in t0.DefaultIfEmpty()
                join a in db.Acts on s1.ActId equals a.Id into t2
                from st3 in t2.DefaultIfEmpty()
                select new OperationListModel
                {
                    Id = o.Id,
                    ProductName = o.Product.Name,
                    Detail = o.Detail,
                    Description = o.Description,
                    OpNumber = o.OpNumber,
                    UnitName = o.Unit.Name,
                    EquipmentName = o.Equipment.Name,
                    Act = t3 == null ? string.Empty : t3.Archive == false ? t3.Act : string.Empty
                })
                .Distinct()
                .ToList();


если поставить Where то отображается только операция с активным актом, а мне надо все операции и акт активный если он есть
...
Рейтинг: 0 / 0
помогите составить linq запрос
    #38922413
Фотография Axeleron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bald56rus,
Ну я сразу сказал - я не проверял запрос, мог накосячить где-то :)
...
Рейтинг: 0 / 0
помогите составить linq запрос
    #38931352
bald56rus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
решил переделать приложение где использовался приведенный Выше запрос,
Код: c#
1.
2.
3.
4.
5.
6.
7.
IEnumerable programs = _programService.GetAllPrograms();
IEnumerable acts = _actService.GetAllActs();
var leftJoin = 
from p in programs
    join aInner in acts on p.ActId equals aInner.Id into step1
    from a in step1.DefaultIfEmpty()
    select new { Id = p.OperationId, Act = a.Number}


падает в ошибку для программ у которых ActId == null, подскажите пожалуйста почему? вроде же должно быть левое соединение
...
Рейтинг: 0 / 0
помогите составить linq запрос
    #38931429
bald56rus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вопрос снимается переписал следующим образом:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
var _operations = _operationService.GetAllOperations();
var _programs = _programService.GetAllPrograms(null);
var _acts = _actService.GetAllActs();
var _actsList = _programs
    .GroupJoin(_acts.Where(a => a.IsArchive == false), p => p.ActId, a => a.Id, (p, a) => new { OperationId = p.OperationId, Act = a.Max(v => v.Number) });
var operations = _operations.GroupJoin(_actsList, o => o.Id, a => a.OperationId, (o, a) => new OperationListModel
{
    Id = o.Id,
    ProductName = o.Product.Name,
    Detail = o.Detail,
    Description = o.Description,
    Number = o.Number,
    EquipmentName = o.Equipment.Name,
    UnitFullName = o.Unit.FullName,
    Act = a.Max(v=>v.Act)
});
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / помогите составить linq запрос
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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