2009-12-13 175 views
0

什么是以下LINQ的等效扩展方法?C#-LINQ-扩展方法

var qry = from a in context.A_Collections 
      from b in context.B_Collections 
      where a.PK == b.PK 
      select 
     new { 
       A_key = a.PK, 
       A_Value = a.Value, 
       B_Key = b.PK, 
       B_value = b.value 
      }; 

我的意思是

(不完全)

var query = context.A_Collections. 
       Where(
         a => a.PK == context.B_Collections.Select(b => b.PK)). 
        Select(
          x => new { 
             A_key = a.Pk, 
             A_Value = a.Value, 
             B_Key = b.PK, 
             B_value = b.value 
            } 
          ); 

回答

5

随后的“从”条款翻译成SelectMany呼叫:

var qry = context.A_Collections 
       .SelectMany(a => context.B_Collections, 
          (a, b) => new { a, b }) 
       .Where(x => x.a.PK == x.b.PK) 
       .Select(x => new { A_key = x.a.PK, 
            A_value = x.a.Value, 
            B_key = x.b.PK, 
            B_value = x.b.Value }); 

的“X”位是由于引入一个透明标识符的。

请注意,拨打Join可能比使用SelectMany(取决于具体情况)更有效,但这是您开始查询的更直接翻译。

0

这将是这样的:

context.A_Collections.Include("B") 
.Where(a => a.PK == a.B.PK) 
.Select(a => 
    new {A_key = a.PK, 
      A_Value = a.Value, 
      B_Key = a.B.PK, 
      b_value = a.B.value }); 
0

尝试使用ReSharper的,这将帮助你所有的LINQ查询转换中的LINQ方法,如果你喜欢这一点。

2

它看起来就像你试图做一个连接,所以这将是:

var query = context.A_Collections.Join(
context.B_Collections, 
a => a.PK, 
b => b.PK, 
(a, b) => new { 
    A_key = a.PK, 
    A_value = a.Value, 
    B_Key = b.PK, 
    B_value = b.value 
}); 

编辑:由于乔恩斯基特然而指出,由编译器完成实际的翻译将使用虽然的SelectMany使用组可能会更有效率。