【问题标题】:convert this LINQ expression into Lambda将此 LINQ 表达式转换为 Lambda
【发布时间】:2010-12-04 05:35:54
【问题描述】:

伙计们,我很难将下面的 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# Lambdas & Linqs”的优秀教程链接,我真的很感激

【问题讨论】:

    标签: c# linq lambda


    【解决方案1】:

    要将 Linq 查询转换为其等效的 Lambda:

    1. 下载Linqpad 并运行您的 询问。
    2. 在结果窗口中,单击 在工具栏中的“λ”按钮上。 它就在结果窗口的正上方
    3. 您的查询将转换为 等效的 Lambda 表达式!

    【讨论】:

    • 我有 Linqpad,但没有创建到我可以查询的服务的“连接”,我看不到 lambda 按钮。我不知道如何粘贴 LINQ 查询并将其转换为 lambda。这真的可能吗?
    • 我刚刚为按钮在 UI 中的位置添加了一张图片。我手头没有 Linqpad,但我认为您需要在那里有一个可运行的查询,然后才能将其转换为 Lambda。在另一篇文章中,我详细介绍了如何在不需要数据库的情况下在 Linqpad 中测试数据,这里:stackoverflow.com/questions/4611031/…
    • 能否将 SQL 转换为 lambda 或 LINQ?好像不行
    • 好久没用了,点击λ旁边的SQL按钮有什么作用呢?
    【解决方案2】:

    【讨论】:

    • 感谢 Dzmitry 的链接......备忘单很有用......我已经看过 101 个样本......
    • 嘿,我在哪里可以得到 101 个样本的源代码.. 任何想法.. 我找不到...
    【解决方案3】:

    这是我遵循的启发式方法:

    当你有连接时,优先使用 LINQ 表达式而不是 lambda。

    我认为带有连接的 lambdas 看起来很乱而且难以阅读。

    【讨论】:

    • 感谢吉姆的回复。但我想在 lambda 中这样做以熟悉.. 我提到它已经用于学习...
    【解决方案4】:

    我通常使用 ReSharper 帮助我将事物转换为方法链和 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) };
    

    然后使用 ReSharper 的将 LINQ 转换为方法链的选项等于以下内容:

            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)
                                        });
    

    虽然输出并不理想,但它至少有助于从某个地方开始理解语法。

    【讨论】:

    • 感谢 Mark 的回复。我会在这里运行它,如果可行,会告诉你。。
    【解决方案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 表达式更难编写和阅读!

    希望这会有所帮助!

    【讨论】:

      【解决方案6】:

      下载LINQPad;它带有用于学习 LINQ 的内置示例。

      【讨论】:

      • 我以为那只是有大量样本等的付费版本
      • 免费版也附送样片。
      【解决方案7】:

      使用 Reflector .NET :)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-07-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多