2015-09-15 2 views
0

Я пытаюсь преобразовать следующий SQL выражение в запросе Lambda LINQ, и я, кажется, идет по кругу на данный момент:Возникли проблемы с лямбда-запросов LINQ

select m.MemberExternalPK FROM Member.Member AS m INNER JOIN Member.Account AS a ON m.MemberID = a.MemberID where m.MemberExternalPK in 
(
    SELECT m.MemberExternalPK 
    FROM Member.Member AS m INNER JOIN Member.Account AS a ON m.MemberID = a.MemberID 
    group by MemberExternalPK 
    having Count(AccountID) = 1 
) 
and AccountStatusID = 3 

До сих пор мне удалось чтобы получить следующий синтаксис, который возвращает правильное количество строк, за которыми я следую, но все столбцы (за исключением MemberExternalPK, который я хочу)!

Members.Join(Accounts, m => m.MemberID, a => a.MemberID, (m, a) => new { m, a }) 
    .GroupBy(t => t.m.MemberExternalPK, t => t.a) 
    .Where(grp => grp.Count(p => p.AccountID != null) == 1) 
    .SelectMany(sublist => sublist).Where(x => x.AccountStatusID == 3) 

ответ

0

Я думаю, что это довольно близко:

var query = 
    from m in Member_Member 
    join a in Member_Account on m.MemberID equals a.MemberID 
    group a by m.MemberExternalPK into gas 
    where gas.Count(ga => ga.AccountID != null) == 1 
    from ga in gas 
    where ga.AccountStatusID == 3 
    select gas.Key; 

Единственная проблема заключается в ga.AccountID != null, что означает, что gas группа может иметь более одной записи, так что вы могли бы в конечном итоге с более чем одной gas.Key в конец.

0

Что-то вроде этого? Разделение его также может повысить производительность.

var externalMembers = 
    Members.Join(Accounts, m => m.MemberID, a => a.MemberID, (m, a) => new { m, a }) 
      .GroupBy(grp => grp.MemberExternalPK) 
      .Where(grp => grp.Count() > 1) 
      .Select(grp => grp.Key); 

var result = 
    Members.Where(w => externalMembers.Contains(w.MemberExternalPK) && w.AccountStatusID == 3) 
      .Select(s => s.MemberExternalPK) 
Смежные вопросы