Преобразование sql-запроса в EF

#sql #entity-framework

#sql #entity-framework

Вопрос:

Может кто-нибудь, пожалуйста, помочь с этим SQL-запросом, чтобы преобразовать его в выражение EF Linq?

 select MI.Id, B.Count, B.Cost, Name, Price, Unity, I.Count, I.Cost, BOL.Date, BOL.type, BOL.Number
        from Balance B inner join MaterialsInfo MI on Mi.Id = B.MaterialsId
        inner join Income I on MI.Id = I.MaterialsId
        inner join BillOfLading BOL on I.BillOfLadingId = BOL.Id

        where B.Id in (select Id from (select max(Date), Id from Balance group by Balance.MaterialsId))

        and I.Id in (select Id from(select max(Date), Income.Id as Id from Income inner join BillOfLading BOL on Income.BillOfLadingId = BOL.Id group by Income.MaterialsId))
 

Я пытался сделать это в течение нескольких дней, поэтому мне действительно нужна помощь.

Вам нужна дополнительная информация?

Заранее благодарю вас.

Редактировать Вот небольшая часть диаграммы, может быть, это поможет Схема БД

Ответ №1:

Похоже, что подзапросы в обоих ваших условиях в предложении where неверны. Потому что ваш

столбец group by отсутствует в инструкции select

И очень непонятно, чего вы пытаетесь добиться от подзапросов.

Без четкого понимания ваших подзапросов все, что я могу подготовить для вас, — это следующее.

 var result = await (from balance in yourDBContect.Balances
            join material in yourDBContect.MaterialsInfos on balance.MaterialsId equals material.Id
            join income in yourDBContect.Incomes on material.Id equals income.MaterialsId
            join bill in yourDBContect.BillOfLadings on income.BillOfLadingId equals bill.Id
            where Balances.GroupBy(g => g.MaterialsId)
                          .Select(s => new
                          {
                               MaterialsId = s.Key,
                               MaxDate = s.Max(x => x.Date)
                          }).ToList().Contains(new { balance.MaterialsId, MaxDate = balance.Date })
            amp;amp; Incomes.Join(BillOfLadings,
                            p => p.BillOfLadingId,
                            e => e.Id,
                            (p, e) => new { p, e })
                      .GroupBy(g => g.p.MaterialsId)
                      .Select(s => new
                      {
                          MaterialsId = s.Key,
                          MaxDate = s.Max(s => s.e.Date)
                      }).ToList().Contains(new { income.MaterialsId, MaxDate = balance.Date })
            select new
            {
                material.Id,
                balance.Count,
                balance.Cost,
                balance.Name,
                balance.Price,
                balance.Unity,
                ICount = income.Count,
                ICost = income.Cost,
                bill.Date,
                bill.Type,
                bill.Number
            });
 

Примечания:

  • Псевдонимы для Income.Count и Income.Cost изменены, поскольку объект не может содержать точно такое же свойство, указанное в коде nenter.
  • Linq для правильного подзапроса заменит new List<int>() .

Комментарии:

1. Большое вам спасибо за помощь. В обоих подзапросах я пытаюсь выбрать строки с максимальной датой. Во-первых, мне нужны эти строки из таблицы балансов, и в этой таблице много строк с одинаковым MaterialsInfoId и разной датой. Во-вторых, то же самое, но с доходами. Более того, в таблице доходов нет столбца даты, поэтому я могу получить дату только из таблицы BillOfLadings. Я добавил диаграмму с этими таблицами, возможно, это поможет понять базу данных и мою проблему)

2. Этот запрос работает для моего в SQLServer, поэтому я не могу понять проблему с группированием по столбцам

3. Отредактировано. Пожалуйста, перепроверьте. Если это не сработает, мы смоделируем весь сценарий.