【问题标题】:Translate LINQ Inline query to extension method将 LINQ 内联查询转换为扩展方法
【发布时间】:2010-07-09 18:04:33
【问题描述】:

我似乎无法弄清楚 LINQ Join 扩展方法...我有以下 LINQ 内联查询:

var cc = from z in zipcodes
         join c in contactsRepo.UDF_SelectSome() on z.Zipcode equals c.Zip       

在 LINQ-extension-method 语法中这个等价物是什么?

【问题讨论】:

  • 您的问题以及此表格的所有问题都在 C# 规范的第 7.16 节中得到解答。
  • 如果您不想阅读规范,ReSharper 等工具很乐意为您来回转换。

标签: c# linq linq-to-sql join extension-methods


【解决方案1】:

您是说 Lambda 语法吗?

var cc = zipcodes.Join(contactsRepo.UDF_SelectSome(),
                       z => z.Zipcode,
                       c => c.Zip,
                       (z, c) => c);

【讨论】:

  • 如果我希望 (z, c) => new 的类型为 contactsRepoResults,我是否还需要强制转换它,或者我可以只做类似 new contactsRepoResults() 的事情吗?因为本质上我只是将连接用作过滤器,所以我仍然希望返回通常由contactsRepo.UDF_SelectSome() 返回的相同内容。
  • @Alex - 我更新以反映这一点。但是请记住,您的原始帖子不会给您这些结果。除非您指定 select 子句,否则它将返回包含两个表的组合字段的新匿名类型。
  • 我缩短了我原来的帖子,因为我的主要问题是加入。在您的更新中,您显示 FieldOne = z.FieldOne 等 - 是否可以在不强制转换每个字段的情况下自动为其分配类型?因为我的类型有 30 多个字段,而且我真的不需要 zipcode 表中的任何字段,所以它与 UDF 通常返回的字段相同(然后正确转换)
  • 或者,我可以让连接返回一个 IQueryable 吗?
【解决方案2】:

如果您使用连接进行过滤,并且只想要一组中的对象,请使用选择该对象的选择器(最后一个参数)。

var cc = contactsRepo.UDF_SelectSome().Join(
  zipcodes,
  c => c.Zip,
  z => z.Zipcode,
  (c, z) => c); 

或者,如果您只想过滤:

var cc = contactsRepo.UDF_SelectSome()
  .Where(c => zipcodes.Any(z => c.Zip == z.ZipCode))

【讨论】:

  • (c, z) => c 正是我想要的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多