Как написать запрос Linq, эквивалентный этому SQL

Я пытаюсь понять, как написать запрос linq, который вернет результаты, эквивалентные приведенному ниже запросу sql. Проблема, с которой я столкнулся, связана с двумя запросами на выборку, включенными в список выбора основного запроса. Мне нужно получить количество записей двух разных типов из таблицы PaymentHistory за последний год. Можно ли написать эквивалент этого с помощью linq? Предпочтительно использовать лямбда-синтаксис.

select ieinum, serviceaddrkey,
  (select count(*) from PaymentHistory where serviceaddrid = serviceaddrkey
   and PostDate >= DateAdd(year, -1 , GetDate())
   and SetID = 100) as ReturnedFees,
(select count(*) from PaymentHistory where serviceaddrid = serviceaddrkey
   and PostDate >= DateAdd(year, -1 , GetDate())
   and SetID = 101) as CorrectedReturnedFees
from Serviceaddr 

Любая помощь будет отличной.


person Chris    schedule 23.05.2013    source источник


Ответы (1)


Возможно что-то вроде этого:

from s in Serviceaddr
let ph = PaymentHistory.Where(p => s.serviceaddrkey == p.serviceaddrkey &&
                                   p.PostDate >= DateTime.Now.AddYears(-1))
select new
{
  s.ieinum,
  s.serviceaddrkey,
  ReturnedFees = ph.Count(p => p.SetID == 100),
  CorrectedReturnedFees = ph.Count(p => p.SetID == 101)
}
person Magnus    schedule 23.05.2013
comment
Спасибо за помощь, Магнус. Я закончил делать что-то немного другое. Оператор SQL, который я предоставил в своем исходном сообщении, если бы я мог заставить его работать в Linq, тогда я собирался использовать второй запрос linq для выбора записей из результатов первого запроса linq, чтобы получить данные, которые мне действительно нужны. Я нашел способ от коллеги получить все результаты в одном запросе linq и хотел поделиться им, если вы заинтересованы. Вот: - person Chris; 24.05.2013
comment
var backdate = DateTime.Today.AddYears(-1); var query = from sa в DataContext.serviceaddrs let Set100 = sa.PaymentHistories.Count(p => p.PostDate ›= backdate && p.SetID == 100) let Set101 = sa.PaymentHistories.Count(p => p.PostDate ›= задним числом && p.SetID == 101) где sa.State == TX && !sa.Status.Contains(Closed) && !sa.Status.Contains(Closed) && !sa.Status.Contains(Inactive-WOFF) && !sa.Status.Contains(Cancel) && !sa.Status.Contains(Bucket) && ((Set100 - Set101) ‹ 2) select sa.IEInum; вернуть запрос.ToList(); - person Chris; 24.05.2013