如何使用LINQ将源表中的每一行连接到一行

本文关键字:一行 连接 LINQ 何使用 | 更新日期: 2023-09-27 18:21:17

我有下表(表A):

ID | Data  |
1  | Data1 |
2  | Data2 |
3  | Data3 |
4  | Data4 |

我有一个表B,它有1行:

DummyID | Dummy  |
1       | Dummy1 |

我必须以以下方式将表A与表B连接起来:

ID | Data  |DummyID | Dummy  |
1  | Data1 |1       | Dummy1 |
2  | Data2 |1       | Dummy1 |
3  | Data3 |1       | Dummy1 |
4  | Data4 |1       | Dummy1 |

显然,我不能在on子句中使用任何ID。

from item in context.TableA
join dummy in context.TableB on ? = ?
select new 
 {
  RowA=item,
  Dummy=dummy
 }

我怎么能用LINQ做到这一点?

如何使用LINQ将源表中的每一行连接到一行

这是一个交叉连接,您可以通过以下方式通过Linq获得

from item in context.TableA
from dummy in context.TableB
select new 
 {
  RowA=item,
  Dummy=dummy
 }

或以下方法语法

context.TableA.SelectMany(
    item => context.TableB.Select(dummy => new { RowA = item, Dummy = dummy }));

请注意,如果TableB每个都有一行以上,则最终会得到N乘M行,其中N是TableA中的行数,M是TableB中的行数来表示。

根本不需要加入。

from item in context.TableA
select new 
{
    RowA = item,
    Dummy = context.TableB.FirstOrDefault()
}

话虽如此,我不得不质疑你为什么这么做。LINQ的想法是将关系数据转换为面向对象的形式。为什么不只检索一次TableB信息,然后在内存中进行任何需要进行的处理呢?它将减少从数据库传输回应用程序的有效负载的大小。

为什么要使用联接。您希望使用旧序列中的每个项目在新序列中创建不同的项目。在LINQ中,您将使用Enumerable。为此选择:

var dummy = context.Dummy.FirstOrDefault();
var newSequence = context.TableA
    .Select(itemInTableA =>
        new
        {
            RowA = itemInTableA,
            Dummy = dummy,
        });