LINQ отбрасывает результаты - PullRequest
2 голосов
/ 20 октября 2011

Я пытаюсь преобразовать сложный (и довольно хакерский) динамический запрос 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 
                && f.FacilityStatusId == 1
                && (p.ExpectedYear == null || d.ExpectedYear == p.ExpectedYear)
                && (p.ExpectedMonth == null || d.ExpectedMonth == p.ExpectedMonth)
                && c.PrimaryArmId == userId 
                && (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 для перечисления каждого месяца в году.

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

Пользователи

  • CustomerCode
  • CustomerName
  • PrimaryArmId

Услуга

  • CustomerCode
  • FacilityId
  • FacilityCurrencyId
  • FaciliyLimit
  • FacilityDescription

ProjectedCashFlows

  • CustomerCode
  • FacilityId
  • ExpectedYear
  • ExpectedMonth
  • ExpectedAmount
  • ProjectedCashFlowStatusId

MonthsCalendar

  • ExpectedMonth
  • ExpectedYear

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

Если запись не существует в ProjectedCashFlows, она должна взять ExpectedMonth & ExpectedYear из таблицы CalendarMonths, вернуть 0 для ExpectedAmount и использовать FacilityId из таблицы Facilities.

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

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

1 Ответ

2 голосов
/ 20 октября 2011

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

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

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

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

where d.ExpectedYear == currentYear 
      && f.FacilityStatusId == 1
      && (p == null ||
          ((p.ExpectedYear == null || d.ExpectedYear == p.ExpectedYear)
          // etc
          ))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...