将纯LINQ C#查询转换为LINQ扩展方法

时间:2017-03-10 09:59:03

标签: c# linq lambda linq-to-sql

我的代码中有这个Linq C#查询:

   var res = from i in context.Instrument
        join g in context.FtpServerGroup on i.FtpServerGroupId equals g.Id
        join f in context.FtpServer on g.Id equals f.FtpServerGroupId
        where i.Deleted && f.NetAddress == netaddress
       select i;

我需要将它转换为.NET核心使用的另一种语法(LINQ扩展方法),这里是一个与上一个查询无关的示例:

context.Instrument.Where(w => !w.Deleted).Include(x => x.FtpServerGroup).ThenInclude(x => x.FtpServers).FirstAsync(i => i.Id == id);

我的问题是,我找不到将第一个查询(三重连接)转换为另一种语法的方法。关于如何找到一些文档或如何做的任何建议?

2 个答案:

答案 0 :(得分:2)

有了resharper的力量:

var res =context.Instrument.Join(context.FtpServerGroup, i => i.FtpServerGroupId, g => g.Id, (i, g) => new {i, g})
                .Join(context.FtpServer, @t => g.Id, f => f.FtpServerGroupId, (@t, f) => new {@t, f})
                .Where(@t => i.Deleted && f.NetAddress == netaddress)
                .Select(@t => i);

答案 1 :(得分:2)

Jon Skeet有一个很好的cheat sheet(向下滚动),用于将查询语法翻译成方法语法

您的查询转换为:

var res = context.Instrument.Join(context.FtpServerGroup, i => i.FtpServerGroupId, g => g.Id, (i,g) => new {i,g})
                 .Join(context.FtpServer, x => x.g.Id, f => f.FtpServerGroupId, (f, x) => new {f, x.g, x.i})
                 .Where(x => x.i.Deleted && x.f.NetAddress == netaddress)
                 .Select(x => x.i);