Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将linq转换为具有多个联接的lambda_C#_Linq_Lambda - Fatal编程技术网

C# 将linq转换为具有多个联接的lambda

C# 将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

我正在尝试将这个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
                         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();