C# 将linq转换为具有多个联接的lambda
我正在尝试将这个linq查询转换为lambdaC# 将linq转换为具有多个联接的lambda,c#,linq,lambda,C#,Linq,Lambda,我正在尝试将这个linq查询转换为lambda var query = (from a in context.Table_A join u in context.Table_B on a.scored equals u.userid join u2 in context.Table_B on a.scorer equals u2.userid
var query = (from a in context.Table_A
join u in context.Table_B on a.scored equals u.userid
join u2 in context.Table_B on a.scorer equals u2.userid
from cs in a.Table_C //(Table_A is related to Table_C)
where (a.date>= startdate && a.date < enddate)
select new MSViewModel
{
scored= u.User.name,
scorer= u2.User.name,
subject_name = cs.Subject.name,
score = cs.score,
categoryid = cs.id,
})
.AsEnumerable()
.GroupBy(t => t.scored)
.ToList();
首先,我同意Arran的评论:查询表达式将更易于处理。我完全同意在有意义的地方使用lambda表单,但是在查询表达式中连接通常要简单得多 话虽如此,你基本上需要模仿。下面的代码未经测试,但在我看来似乎有点似是而非
var query = context.Table_A
.Join(context.Table_B, a => a.scored, u => u.userid,
(a, u) => new { a, u })
.Join(context.Table_B, p => p.a.scorer, u2 => u2.userid,
(p, u2) => new { p, u2 })
.SelectMany(q => q.p.a.TableC, (q, cs) => new { q, cs })
.Where(r => r.q.p.a.date >= startdate && r.q.p.a.date < enddate)
.Select(q => new MSViewModel {
scored= r.q.p.u.User.name,
scorer= r.q.u2.User.name,
subject_name = r.cs.Subject.name,
score = r.cs.score,
categoryid = r.cs.id,
})
.AsEnumerable()
.GroupBy(t => t.scored)
.ToList();
var query=context.Table\u A
.Join(context.Table_B,a=>a.scored,u=>u.userid,
(a,u)=>新的{a,u})
.Join(context.Table_B,p=>p.a.scorer,u2=>u2.userid,
(p,u2)=>新的{p,u2})
.SelectMany(q=>q.p.a.TableC,(q,cs)=>new{q,cs})
其中(r=>r.q.p.a.date>=开始日期和r.q.p.a.datenew MSViewModel{
得分=r.q.p.u.User.name,
scorer=r.q.u2.User.name,
subject_name=r.cs.subject.name,
分数=r.cs.分数,
类别id=r.cs.id,
})
.可计算的()
.GroupBy(t=>t.scored)
.ToList();
基本上,p
和q
和r
是这里的透明标识符。您有三个,因为您有两个联接和一个后续的from
子句。试试这个:
var query = (_context.Table_A.Join(_context.Table_B, a => a.scored, u =>
u.userid,
(a, u) => new {a, u}).Join(_context.Table_B,
@t => @t.a.scorer,
u2 => u2.userid,
(@t, u2) => new {@t, u2}).
SelectMany(@t => _context.Table_A, (@t, cs) => new MSViewModel()
{
scored = @t.@t.u.User.name,
scorer= @t.u2.User.name,
subject_name = @t.cs.Subject.name,
score = @t.cs.score,
categoryid = @t.cs.id,
})).AsEnumerable()
.ToList();
若要扩展我的评论,请使用Resharper: Resharper显示将LINQ转换为Lambada的选项 转换后:
为什么?我个人认为后者很难阅读。是的,但这是我的要求,我没有发言权it@deidarasong:向后推。这是一个愚蠢的要求,我允许你将其逐字传递给你的TL或任何人:)如果你有Resharper,它将给你一个选项,将LINQ转换为Lambada…@deidarasong:记住,
Jon Skeet
告诉你:你缺少一个Where调用,这就是为什么需要三个而不是两个透明标识符的原因。
var query = (_context.Table_A.Join(_context.Table_B, a => a.scored, u =>
u.userid,
(a, u) => new {a, u}).Join(_context.Table_B,
@t => @t.a.scorer,
u2 => u2.userid,
(@t, u2) => new {@t, u2}).
SelectMany(@t => _context.Table_A, (@t, cs) => new MSViewModel()
{
scored = @t.@t.u.User.name,
scorer= @t.u2.User.name,
subject_name = @t.cs.Subject.name,
score = @t.cs.score,
categoryid = @t.cs.id,
})).AsEnumerable()
.ToList();