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

时间:2015-11-09 15:09:38

标签: c# linq

我有下表(表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做到这一点?

3 个答案:

答案 0 :(得分:6)

这是一个交叉联接,您可以通过以下方式通过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中的行数。

答案 1 :(得分:1)

根本不需要加入。

HashSet<Integer> set = new HashSet<Integer>();

set.add(num);//returns true if the num was not inserted before else return false

if(!set.add(num))//set also has a contains method
{
  System.out.println("You already entered " + num);
}

话虽如此,我不得不质疑你为什么要这样做。 LINQ的想法是将关系数据转换为面向对象的形式。为什么不只检索一次from item in context.TableA select new { RowA = item, Dummy = context.TableB.FirstOrDefault() } 信息并执行内存中需要处理的任何处理?它会减少您从数据库传输回应用程序的有效负载大小。

答案 2 :(得分:0)

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

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