帮助理解Enumerable.Join方法

Chr*_*cia 11 .net c# linq asp.net

昨天我发布了关于在Join()方法中使用lambdas来检查2个实体中是否存在2个条件的问题.我收到了关于这个问题的答案.我在阅读了关于Enumerable.Join()方法的MSDN文章之后想到了,我完全理解发生了什么,但我没有.有人可以帮我理解下面代码中的内容(具体是Join()方法)吗?提前致谢.

if (db.TableA.Where( a => a.UserID == currentUser )
      .Join( db.TableB.Where( b => b.MyField == someValue ),
             o => o.someFieldID,
             i => i.someFieldID,
             (o,i) => o )
      .Any()) 
{
    //...
}
Run Code Online (Sandbox Code Playgroud)

编辑:具体来说,我很好奇最后3个参数,以及实际发生了什么.它们如何导致Func(TOuter,TKey),Func(TInner,TKey)等的签名要求.

Eri*_*ert 22

连接语法是

FirstTable.Join(SecondTable, FirstTableKeyExtractor, SecondTableKeyExtractor, Selector)
Run Code Online (Sandbox Code Playgroud)

所以你有两张桌子.您有两个表共有的密钥.您提供了两个关键提取器,它们知道如何从表中的每一行获取密钥.

连接逻辑标识具有相同密钥的每对表中的一对行.

然后,每个行都通过选择器运行以投影结果.

这是否回答你的问题?


Mik*_*son 5

加入的说明.

b=第一个表的 o对象类型i= 第一个表的 对象类型=第二个表的对象类型

  1. db.TableB.Where( b => b.MyField == someValue ) 这是第二个表的元素类型
  2. o => o.someFieldID 第一张表的关键
  3. i => i.someFieldID 第二个表的键(与第一个表中的键匹配)
  4. (o,i) => o 要返回的对象,在本例中是第一个表的对象类型.


Ric*_*ein 3

埃里克和尼克都提供了很好的答案。

您还可以使用查询语法(相对于您在示例中使用的方法语法)编写 Linq 查询表达式:

var query = from a in db.TableA 
            join b in db.TableB on a.someFieldID equals b.someFieldID
            where a.UserID == currentUser && b.MyField == someValue
            select a;

        if (query.Any()) {
            ...
        }
Run Code Online (Sandbox Code Playgroud)

更新:

您似乎陷入了 lambda 表达式。它是一个像变量一样传递的函数。lambda 表达式相当于匿名委托(或者匿名方法,对我来说更一般)。

以下是使用 lambda 表达式作为委托的查询(当然,请将 EntityType 替换为从 TableA 返回的实体的类型):

if (db.TableA.Where( delegate(EntityType a) { return a.UserID == currentUser; } ) 
  .Join( db.TableB.Where( delegate(EntityType b) { return b.MyField == someValue; } ), 
         delegate(EntityType o) { return o.somefieldId); },
         delegate(EntityType i) { return i.someFieldId); },
         delegate(EntityType o, EntityType i) { return o; }) 
  .Any())  
Run Code Online (Sandbox Code Playgroud)

{ //... }

注意:lambda 表达式具有重要的方面,使其不仅仅是匿名方法的等效项。我建议您查看其他 SO 问题,特别是在线阅读有关 lambda 表达式的内容。它们允许以更简单和优雅的方式表达非常强大的想法。这是一个很深的主题,但基础知识很容易理解。它是一个可以像变量一样传递的函数,或者作为其他函数的参数。