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

C# 如何使用LINQ将一行连接到源表中的每一行,c#,linq,C#,Linq,我有下表(表A): 我的表B有一行: 我必须以以下方式将表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 dum

我有下表(表A):

我的表B有一行:

我必须以以下方式将表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获得

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的思想是将关系数据转换为面向对象的形式。为什么不只检索一次
表b
信息,并在内存中执行任何需要执行的处理?这将减少从数据库传输回应用程序的有效负载的大小。

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

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

你不需要加入。只需使用另一个“from”:context.TableA from dummy in context.TableB选择new{…}如果TableB始终有一行,则添加
context.TableB.First()
将执行以下操作trick@dbarnes:哎呀,忘记了
FirstOrDefault
。实际上,我在我的一个数据库中尝试了这个方法,并且
First
给出了一个错误,但是
FirstOrDefault
有效。我本想添加它,但在从LINQPad传输到我的响应时出错。现在修好了。@CraigW。我对虚拟数据做了一些额外的工作,只是为了简化问题而省略了它。虽然如果TableB只有一行,这可能没什么大不了的。我写这篇文章是为了让它更容易理解。当然,您可以编写Dummy=Dummy.FirstOrDefault(),是的,确实如此。这就是我需要的。谢谢
from item in context.TableA
select new 
{
    RowA = item,
    Dummy = context.TableB.FirstOrDefault()
}
var dummy = context.Dummy.FirstOrDefault();
var newSequence = context.TableA
    .Select(itemInTableA =>
        new
        {
            RowA = itemInTableA,
            Dummy = dummy,
        });