#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
))