2013-03-03 33 views
1

这是我参加的LINQ我只是觉得在那里将它与拉姆达写任何可能的方式:编写复杂的LINQ加入与Lambda表达式

enter image description here

任何人不会对此有任何想法?任何建议?

+1

是的。如果您不确定从哪里开始,请先尝试一个较小的练习例子。 – 2013-03-03 14:47:37

+3

请复制并粘贴代码*作为文本*而不是截图。你已经让*任何人都难以回答......通常能够从问题中复制并编辑是有用的... – 2013-03-03 14:49:54

+1

你可以复制和粘贴代码而不是图像,所以我可以很容易地测试它? – 2013-03-03 14:53:16

回答

7

所有 LINQ查询表达式可以转换成“点号”(方法调用) - 这是基本的编译器做什么。然而,它为连接(和一些其他操作)引入了透明标识符,这些连接使得使用lambda表达式的等效代码更为简单。

鉴于代码将最终完全等同于查询表达式,我建议你坚持使用查询表达式版本。

如果你真的想转换为点符号出于某种原因,我强烈建议你这样做一个简单的例子第一个 - 一个连接只有几个属性。你会感觉到你需要做什么,并可以逐渐建立起来。

我的Edulinq post on query expression translation给出了编译器执行的所有转换的一些细节 - 这是一个很好的实验起点。

3

它打印了出来没有一个IDE,所以肯定有些失误......

join ... on ... equals ... into成为GroupJoin

from ... in group.DefaultIfEmpty变得比SelectMany(group.DefaultIfEmpty)

其他,它是所有关于使用多个匿名类型管理范围。

var joinResult1 = FormReportDataTable.AsEnumerable() 
    .GroupJoin(dtFormsCategories.AsEnumerable(), 
    dr1 => dr1["FormID"], dr2 => dr2["ObjectID"], 
    (dr1, dr2s) => new {dr1 = dr1, dr2s = dr2s}) 
    .SelectMany(g => g.dr2s.DefaultIfEmpty(), (g, dr2) => new {dr1 = g.dr1, dr2 = dr2 }) 
    .GroupJoin(drEntities.AsEnumerable(), 
    x => (Guid)x.dr1["EntityID"], er => (Guid)er["ID"], 
    (x, ers) => new {dr1 = x.dr1, dr2 = x.dr2, ers = ers}) 
    .SelectMany(g => g.ers.DefaultIfEmpty(), (g, er) => new {dr1 = g.dr1, dr2 = g.dr2, er = er }) 
    .GroupJoin(dtCategories.AsEnumerable(), 
    x => (Guid)x.dr2["CategoryID"], cr => (Guid)cr["ID"], 
    (x, crs) => new {dr1 = x.dr1, dr2 = x.dr2, er = x.er, crs = crs}) 
    .SelectMany(g => g.crs.DefaultIfEmpty(), (g, cr) => new {dr1 = g.dr1, dr2 = g.dr2, er = g.er, cr = cr }) 

var joinResult = joinResult1.Select(x => new 
{ 
    SubPortalName = x.cr == null ? string.Empty : ... 
    ... //could have posted this code if it was in the question... 
}); 
+0

真的使SQL看起来更容易呃 – BigOmega 2013-08-06 13:11:13

+2

@ioSamurai如果你认为这很糟糕,你还没有看到我见过的SQL。 – 2013-08-06 17:25:29