【问题标题】:LINQ Fluent API version of left join query左连接查询的 LINQ Fluent API 版本
【发布时间】:2014-04-11 02:13:25
【问题描述】:

我目前有一个运行良好的 LINQ 查询,但我想知道如何将其转换为 LINQ fluent API 格式。我曾尝试在 Google 上搜索关于 fluent API 的体面教程,以尝试自己学习,但似乎没有。

这是我要转换的查询:

from s in db.Sections
join f in db.Files
    on s.LogoFileID equals f.ID into s_f
where s.RouteName == SectionRoute
from x in s_f.DefaultIfEmpty()
select new GameSectionVM
{
    SectionID = s.ID,
    GameTitle = s.Title,
    LogoFileName = x.FileName,
    Synopsis = s.Synopsi
}).Single();

【问题讨论】:

  • 每次操作一项。查看连接查询的文档和示例,并查看相应方法的文档。在一个方法调用中加入数据。完成后,过滤掉符合过滤条件的行。继续为您拥有的每个操作执行此操作。
  • 我知道如何选择和在哪里,但我无法在连接中找到任何我能理解的东西。就像我在 OP 中所说的那样,我搜索了教程但没有找到任何东西。
  • 首先,与其寻找关于将查询语法转换为方法语法的教程,不如寻找如何连接两个查询。有 很多 教程向您展示如何做到这一点。即使没有,也只需要查看MSDN中LINQ方法的文档,看看有哪些操作,它们做了什么,如何调用它们,包括很多例子。此外,如果有些部分你确实知道该怎么做,那么不要问如何去做。询问您不知道如何做的事情,而不是在您已经完成 75% 的事情时要求我们做所有事情。
  • Resharper 可以为你做到这一点,外连接等同于 LINQ 方法语法中的 GroupJoin
  • @Servy 我正在寻找关于流利 API 的一般教程,而不是关于转换的东西。我发现的大多数东西不是关于 fluent API 而是使用我显示的代码方法。

标签: c# linq


【解决方案1】:

ReSharper 提供以下转换:

(db.Sections.GroupJoin(db.Files, s => s.LogoFileID, f => f.ID, (s, s_f) => new { s, s_f })
          .Where(@t => s.RouteName == SectionRoute)
          .SelectMany(@t => s_f.DefaultIfEmpty(), (@t, x) => new GameSectionVM
                                                             {
                                                                 SectionID = s.ID,
                                                                 GameTitle = s.Title,
                                                                 LogoFileName = x.FileName,
                                                                 Synopsis = s.Synopsi
                                                             })).Single();

我不能保证它的准确性,但它至少应该可以帮助您入门。 GroupJoin 似乎是您至少需要进行外部联接。

【讨论】:

  • 谢谢,我将尝试使用 GroupJoin,我试图使用普通的 Join,但没有发现任何帮助。我想那是因为我在寻找错误的东西。
【解决方案2】:

很难确切地说出在您的情况下什么会起作用,因为您没有提供所有涉及类型的详细信息;但是,大致上是这样的:

(db.Sections.GroupJoin(db.Files, s => s.LogoFileID, f => f.ID, (s, s_f) => new {s, s_f})
    .Where(t => t.s.RouteName == SectionRoute)
    .SelectMany(t => t.s_f.DefaultIfEmpty(), (t, x) => new GameSectionVM
    {
        SectionID = t.s.ID,
        GameTitle = t.s.Title,
        LogoFileName = x.FileName,
        Synopsis = t.s.Synopsis
    })).Single();

假设Section 类存在并且具有正确命名的属性Synopsis(不是Sysnopsi

【讨论】:

  • 是的,Sysnopsi 是 type-o。不得不重新输入代码,因为它在我的笔记本电脑上,当时我无法上网。不知道你想要什么更多的信息。我发布的代码已经可以工作,所以表格之间的联系就在那里。
猜你喜欢
  • 1970-01-01
  • 2015-09-13
  • 1970-01-01
  • 1970-01-01
  • 2016-10-02
  • 1970-01-01
  • 1970-01-01
  • 2023-03-19
  • 1970-01-01
相关资源
最近更新 更多