LINQ:多个JOINS没有使用点符号的长最终匿名变量

Hea*_*iff 1 c# linq

我有一个使用点符号的Linq查询,它必须与几个不同的枚举进行连接.我发现进行多重连接的方法是一个接一个地执行:而不是相当于以下SQL语句的东西:

SELECT
   blah blah blah
FROM
   tableOne as One, tableTwo as Two, tableThree as Three
WHERE
   One.fieldOne == Two.fieldOne AND
   One.fieldTwo == Three.fieldTwo AND
   One.fieldThree == something
Run Code Online (Sandbox Code Playgroud)

它最终会像:

SELECT
    blah blah blah
FROM
    (
      SELECT 
          blah blah blah
      FROM
          tableOne as One, tableTwo as Two
      WHERE
          One.fieldOne == Two.fieldOne
          One.fieldThree == something
    ) as firstJoin,
    tableThree as Three
WHERE
    firstJoin.fieldTwo == Three.fieldTwo
Run Code Online (Sandbox Code Playgroud)

Linq中的.Join()看起来像:

localTableOne.Join(localTableTwo,
                   One => One.fieldOne,
                   Two => Two.fieldOne,
                   (One, Two) => new { One, Two })
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是,一旦我进入第二个JOIN,前一个JOIN结果的结果的匿名变量没有属性"fieldOne"或"fieldTwo"或本地表的任何字段都加入.它有一个属性"One",它具有第一个表中的属性,以及属性"Two",具有表2中的属性.因此,如果我想将这些结果与另一个表连接,则内部的lambda函数表看起来像

firstJoinResult => firstJoinResult.One.fieldOne
Run Code Online (Sandbox Code Playgroud)

如果我只加入三张桌子,这不会有问题.我目前正在加入7桌.Linq查询以.Select()函数结束,因此lambda函数的字段最终看起来像:

fieldOne = seventhJoin.sixthJoin.fifthJoin.fourthJoin.thirdJoin.secondJoin.firstJoinResult.One.fieldOne
Run Code Online (Sandbox Code Playgroud)

有什么方法可以让这个电话更小吗?在某种程度上访问我正在寻找的领域?另一种进行多重连接的方法?

谢谢

UPD

我忘了提到我正在寻找使用点符号Linq的解决方案.

Adu*_*cci 5

使用查询语法,它看起来像这样

var query = from One in tableOne 
            from Two in tableTwo
            from Three in tableThree
            where One.fieldOne == Two.fieldOne
            where One.fieldTwo == Three.fieldTwo
            where One.fieldThree == something
            select new {
            };
Run Code Online (Sandbox Code Playgroud)

  • @Heathcliff:但是*为什么*你会寻找点符号解决方案吗?查询表达式的重点在于使这种复杂的情况变得更简单.您应该使用两种形式,具体取决于哪种形式最具可读性. (5认同)