如何在单个连接中的多个字段LINQ中join

我需要做一个LINQ2DataSet查询,在一个以上的领域(如

var result = from x in entity join y in entity2 on x.field1 = y.field1 and x.field2 = y.field2 

我还没有find一个合适的解决scheme(我可以将额外的约束添加到where子句,但是这远远不是一个合适的解决scheme,或者使用这个解决scheme,但假设是一个equijoin)。

是否有可能在一个连接的多个领域joinLINQ的LINQ?

编辑

 var result = from x in entity join y in entity2 on new { x.field1, x.field2 } equals new { y.field1, y.field2 } 

是我引用上面假设一个equijoin的解决scheme。

进一步编辑

为了回答我原来的例子是一个equijoin的批评,我确实承认,我目前的要求是为了一个equijoin,而且我已经使用了上面提到的解决scheme。

然而,我正在试图了解我有什么可能性和最佳实践,应该使用LINQ。 我将需要做一个date范围查询连接与表ID很快,只是先发制人的问题,看来我必须在where子句中添加date范围。

感谢一如既往的所有build议和意见

匿名types的解决scheme应该可以正常工作。 LINQ只能代表等间联系(无论如何都是连接子句),实际上这就是你所说的基于你原来的查询要expression的东西。

如果由于某些特定原因您不喜欢匿名types的版本,则应该解释原因。

如果你想做一些你最初想要做的事情,请举一个你真正想做的事情的例子。

编辑:响应编辑的问题:是的,做一个“date范围”join,你需要使用一个where子句来代替。 它们在语义上相当,所以这只是可用的优化问题。 Equijoins通过创build基于内部序列的查找来提供简单的优化(在LINQ到对象中,其中包括LINQ到数据集) – 将其视为从键到与该键匹配的条目序列的哈希表。

这样做与date范围是有点困难。 然而,根据你所说的“date范围join”的意思,你可能会做类似的事情 – 如果你打算创builddate的“乐队”(例如每年一个),使得两个条目发生在同一年(但不是在同一天)应该匹配,那么你可以做到这一点,只要使用该频段作为关键。 如果它更复杂,例如连接的一边提供了一个范围,而连接的另一边提供了一个单一的date,如果它落在这个范围内则是匹配的,那么最好用一个where子句处理(在第二个子句之后)IMO。 你可以通过命令一方或另一方来更有效地find一些特别的魔法,但是这将是很多工作 – 我只会在检查性能是否是一个问题之后做这样的事情。

 var result = from x in entity join y in entity2 on new { x.field1, x.field2 } equals new { y.field1, y.field2 } 

只需要用等效的方法链语法来完成这个工作:

 entity.Join(entity2, x => new {x.Field1, x.Field2}, y => new {y.Field1, y.Field2}, (x, y) => x); 

而最后一个参数(x, y) => x是你select的(在上面的例子中我们selectx )。

 var result = from x in entity1 join y in entity2 on new { X1= x.field1, X2= x.field2 } equals new { X1=y.field1, X2= y.field2 } 

如果列名在两个实体中不同,则需要执行此操作。

我认为更可读和更灵活的select是使用Where函数:

 var result = from x in entity1 from y in entity2 .Where(y => y.field1 == x.field1 && y.field2 == x.field2) 

这也允许通过追加.DefaultIfEmpty()从内部连接到左连接轻松地进行切换。

 var result = from x in entity join y in entity2 on new { X1= x.field1, X2= x.field2 } equals new { X1=y.field1, X2= y.field2 } select new { /// Columns }; 

使用连接运算符只能执行等高连接。 其他types的连接可以使用其他操作符来构build。 我不确定使用这些方法或者更改where子句,您尝试执行的确切连接是否会更容易。 关于连接子句的文档可以在这里find。 MSDN有一篇关于连接操作的文章,还有多个链接指向其他连接的例子。

你可以做一些像(下)

 var query = from p in context.T1 join q in context.T2 on new { p.Col1, p.Col2 } equals new { q.Col1, q.Col2 } select new {p...., q......}; 

如果字段名称在实体中是不同的

 var result = from x in entity join y in entity2 on new { field1= x.field1, field2 = x.field2 } equals new { field1= y.field1, field2= y.myfield } select new {x,y}); 

声明一个Class(Type)来保存你想要join的元素。 在下面的例子中声明JoinElement

  public class **JoinElement** { public int? Id { get; set; } public string Name { get; set; } } results = from course in courseQueryable.AsQueryable() join agency in agencyQueryable.AsQueryable() on new **JoinElement**() { Id = course.CourseAgencyId, Name = course.CourseDeveloper } equals new **JoinElement**() { Id = agency.CourseAgencyId, Name = "D" } into temp1 
 from d in db.CourseDispatches join du in db.DispatchUsers on d.id equals du.dispatch_id join u in db.Users on du.user_id equals u.id join fr in db.Forumreports on (d.course_id + '_' + du.user_id) equals (fr.course_id + '_'+ fr.uid) 

这对我有用