Удаление результатов LINQ

#c# #linq #linq-to-sql #.net-3.5

#c# #linq #linq-to-sql #.net-3.5

Вопрос:

Я пытаюсь преобразовать сложный (и довольно хакерский) динамический SQL-запрос в запрос LINQ.

Пока у меня есть следующий запрос LINQ:

 var results = (
    from c in Customers
    from d in MonthCalendar
        join f in Facilities on c.CustomerCode equals f.CustomerCode
        join p in ProjectedCashFlows on f.FacilityId equals p.FacilityId into pj
                from p in pj.DefaultIfEmpty()                      
        where d.ExpectedYear == currentYear 
                amp;amp; f.FacilityStatusId == 1
                amp;amp; (p.ExpectedYear == null || d.ExpectedYear == p.ExpectedYear)
                amp;amp; (p.ExpectedMonth == null || d.ExpectedMonth == p.ExpectedMonth)
                amp;amp; c.PrimaryArmId == userId 
                amp;amp; (p.ProjectedCashFlowStatusId == null || p.ProjectedCashFlowStatusId != 4)
        select new 
            {
                CustomerCode = c.CustomerCode,
                CustomerName = c.CustomerName,
                FacilityId = f.FacilityId,
                FacilityDescription = f.FacilityProductDescription,
                FacilityCurrency = f.FacilityCurrencyId,
                FacilityLimit = f.Limit,
                ExpectedYear = d.ExpectedYear,
                ExpectedMonth = d.ExpectedMonth,
                ExpectedAmount = p == null ? 0 : (double)p.ExpectedAmount

            }
            );
  

Я пытаюсь получить сведения из Customer таблицы, которая имеет отношение «один ко многим» с Facilities таблицей. Затем я пытаюсь получить любые сведения, расположенные в ProjectedCashFlows

Проблема, с которой я сталкиваюсь, заключается в том, что запрос должен возвращать все Customer и Facilites информацию независимо от того, существуют ли какие-либо значения в ProjectedCashFlows таблице.

К сожалению, этот запрос этого не делает — он возвращает только Customer информацию и Facilities информацию, когда средство существует в ProjectedCashFlows таблице.

Я использовал MonthCalender таблицу для составления списка каждого месяца в году.

Соответствующая табличная информация:

Клиенты

  • Пользовательский код
  • Пользовательское имя
  • PrimaryArmId

Средства

  • Пользовательский код
  • FacilityId
  • FacilityCurrencyId
  • Упрощенный предел
  • Упрощениеописание

Запроектированные потоки денежных средств

  • Пользовательский код
  • FacilityId
  • Ожидаемый год
  • Ожидаемый месяц
  • Ожидаемое количество
  • ProjectedCashFlowStatusId

Месячный календарь

  • Ожидаемый месяц
  • Ожидаемый год

В качестве примера у меня есть клиент, у которого в Facilities таблице 4 строки, однако 2 из этих объектов не отображаются в ProjectedCashFlows таблице, поэтому они не отображаются.

Если запись в нем не существует, ProjectedCashFlows она должна брать ожидаемые месяцы и ожидаемые годы из CalendarMonths таблицы, возвращать 0 для ожидаемого количества и использовать FacilityId из Facilities таблицы.

Как вы, вероятно, можете понять, я только начал использовать LINQ.

Кто-нибудь может подтолкнуть меня в правильном направлении?

Ответ №1:

В вашем запросе используется p предположение, что оно не равно нулю:

 where d.ExpectedYear == currentYear 
      amp;amp; f.FacilityStatusId == 1
      amp;amp; (p.ExpectedYear == null || d.ExpectedYear == p.ExpectedYear)
      // etc
  

Но вы использовали DefaultIfEmpty() which логически создаст последовательность с одним нулевым значением, когда нет ProjectedCashFlows.

Итак, в основном вам нужно что-то вроде:

 where d.ExpectedYear == currentYear 
      amp;amp; f.FacilityStatusId == 1
      amp;amp; (p == null ||
          ((p.ExpectedYear == null || d.ExpectedYear == p.ExpectedYear)
          // etc
          ))