这个转换LINQ表达入λ(convert this LINQ expression into Lam

2019-07-21 02:10发布

伙计们,我也很难将这种低于LINQ表达式(左连接实现)lambda表达式(学习)。

var result = from g in grocery
       join f in fruit on g.fruitId equals f.fruitId into tempFruit
       join v in veggie on g.vegid equals v.vegid into tempVegg
       from joinedFruit in tempFruit.DefaultIfEmpty()
       from joinedVegg in tempVegg.DefaultIfEmpty()
       select new { g.fruitId, g.vegid, fname = ((joinedFruit == null) ? string.Empty :     joinedFruit.fname), vname = ((joinedVegg == null) ? string.Empty : joinedVegg.vname) };

有人建议我如何做到这一点。

我真的很感激,如果有人给我“C#lambda表达式和Linqs”的优秀教程链接

Answer 1:

到LINQ查询转换为它的lambda相当于:

  1. 下载Linqpad和运行查询。
  2. 在结果窗口中,单击工具栏上的“λ”按钮。 这是正确的上面的结果窗口
  3. 您的查询将被转换为Lambda表达式相当于!



Answer 2:

你可以看看101个LINQ样品和C#3.0的查询表达式翻译小抄



Answer 3:

下面是我遵循启发:

青睐LINQ表达了lambda表达式时,你有加入。

我认为,随着lambda表达式联接显得凌乱而难以阅读。



Answer 4:

我通常使用的ReSharper帮我转换的事情方法链,拉姆达的,这有助于我去来回还算方便。

    var result = from g in grocery
                 join f in fruit on g.fruitId equals f.fruitId into tempFruit
                 join v in veggie on g.vegid equals v.vegid into tempVegg
                 from joinedFruit in tempFruit.DefaultIfEmpty()
                 from joinedVegg in tempVegg.DefaultIfEmpty()
                 select new { g.fruitId, g.vegid, fname = ((joinedFruit == null) ? string.Empty : joinedFruit.fname), vname = ((joinedVegg == null) ? string.Empty : joinedVegg.vname) };

然后使用LINQ转换到方法链的ReSharper的选项等于以下:

        var result =grocery .GroupJoin(fruit, g => g.fruitId, f => f.fruitId, (g, tempFruit) => new {g, tempFruit})
                            .GroupJoin(veggie, @t => @t.g.vegid, v => v.vegid, (@t, tempVegg) => new {@t, tempVegg})
                            .SelectMany(@t => @t.@t.tempFruit.DefaultIfEmpty(), (@t, joinedFruit) => new {@t, joinedFruit})
                            .SelectMany(@t => @t.@t.tempVegg.DefaultIfEmpty(),(@t, joinedVegg) =>
                                new
                                    {
                                        @t.@t.@t.g.fruitId,
                                        @t.@t.@t.g.vegid,
                                        fname = ((@t.joinedFruit == null) ? string.Empty : @t.joinedFruit.fname),
                                        vname = ((joinedVegg == null) ? string.Empty : joinedVegg.vname)
                                    });

诚然输出小于可取的,但它在理解语法开始的地方至少有帮助。



Answer 5:

这里是你会如何写在lambda这个查询:

var cus­tomers = new List {
new Cus­tomer { Com­pa­nyId = “AC”, Cus­tomerId = “Customer1” },
new Cus­tomer { Com­pa­nyId = “not-AC”, Cus­tomerId = “Customer2” },
};

var user­Cus­tomers = new List {
new User­Cus­tomer { Com­pa­nyId = “AC”, Cus­tomerId = “Customer1”, User = “not-admin” },
new User­Cus­tomer { Com­pa­nyId = “AC”, Cus­tomerId = “Customer1”, User = “admin” },
new User­Cus­tomer { Com­pa­nyId = “AC”, Cus­tomerId = “Customer2”, User = “not-admin” },
new User­Cus­tomer { Com­pa­nyId = “AC”, Cus­tomerId = “Customer2”, User = “admin” },
new User­Cus­tomer { Com­pa­nyId = “not-AC”, Cus­tomerId = “Customer1”, User = “not-admin”     },
new User­Cus­tomer { Com­pa­nyId = “not-AC”, Cus­tomerId = “Customer1”, User = “admin” },
new User­Cus­tomer { Com­pa­nyId = “not-AC”, Cus­tomerId = “Customer2”, User = “not-admin” },
new User­Cus­tomer { Com­pa­nyId = “not-AC”, Cus­tomerId = “Customer2”, User = “admin” }
};

使用查询表达式

var query =
from c in cus­tomers
join uc in user­Cus­tomers on
new { c.CompanyId, c.CustomerId } equals new { uc.CompanyId, uc.CustomerId }
where c.CompanyId == “AC” && uc.User == “admin“
select c;

使用lambda表达式

var lambda =  cus­tomers.Where(c => c.CompanyId == “AC”) // inner sequence
.Join(userCustomers.Where(uc => uc.User == “admin”), // outer sequence
c => new { c.CompanyId, c.CustomerId }, // inner key selec­tor
uc => new { uc.CompanyId, uc.CustomerId }, // outer key selec­tor
(c, uc) => c);

这两种方法产生相同的结果(客户与公司ID“AC”和客户ID“customer1表”),但你可以看到,lambda表达式是更难写和读!

希望这可以帮助!



Answer 6:

下载LINQPad ; 它配备了学习LINQ内置样本。



Answer 7:

使用.NET反射:)



文章来源: convert this LINQ expression into Lambda
标签: c# linq lambda