c#Linq选择加入选择组

Ill*_*ion 4 c# linq select group-by inner-join

我有这个MS-SQL语句:

SELECT cv.id FROM ContactValue cv
INNER JOIN (
        SELECT mainId, max(version) as v
        FROM ContactValue
        WHERE version <= $Version(int)
        GROUP BY mainId
) 
AS t ON t.mainId = cv.mainId AND t.v = cv.version 
WHERE cv.contact_id = $ContactID(int) 
      AND cv.isActive = 1 
      ORDER BY sort'
Run Code Online (Sandbox Code Playgroud)

并希望在linq中实现.我确实将上面的查询分成了多个查询,表现并不快.linq加入是否存在任何linq?

我的C#代码:

            var groupMax = from cv in db.ContactValue
                           where cv.contact_id == ContactID && cv.version <= Version
                           orderby cv.sort
                           group cv by cv.mainId into gcv
                           select new { mainID = gcv.Key, version = gcv.Max(cv => cv.version) };

            foreach (var data in groupMax.ToList())
            {
                var Query = from cv in db.ContactValue
                            where cv.contact_id == ContactID && cv.mainId == data.mainID && cv.version == data.version && cv.isActive == true
                            select cv;

                if (Query.Count() > 0)
                {
                    ContactValue tmp = Query.First();
                }
            }
Run Code Online (Sandbox Code Playgroud)

我希望得到1-2个查询的所有联系人而不是1个查询然后每个联系人另一个查询...

请帮我 !

And*_*rei 7

是的,Linq to SQL确实实现了内连接:

var groupMax =
    from cv in db.ContactValue
    where cv.contact_id == ContactID && cv.version <= Version
    orderby cv.sort
    group cv by cv.mainId into gcv
    select new { mainID = gcv.Key, version = gcv.Max(cv => cv.version) };

var res =
    from cv in db.ContactValue
    join gm in groupMax on cv.version equals gm.version
    where cv.contact_id == ContactID && cv.isActive
    orderby cv.version ascending /*for example*/
    select cv
Run Code Online (Sandbox Code Playgroud)