2013-05-28 57 views
0

考虑,我们有这两个实体和一个自定义对象:实体框架返回重复的记录后加入

public class Entiy1 
{ 
    public int Id { get; set; } 
    public int DestinationId { get; set; } 
    public string Name { get; set; } 
    public string JobTitle { get; set; } 
} 

public class Entiy2 
{ 
    [Key] 
    public int DestinationId { get; set; } 
    public int DestinationName { get; set; } 


} 
public class EntityDTO 
{ 
    public int DestinationName { get; set; } 
    public int DestinationId { get; set; } 
    public string Name { get; set; } 
    public string JobTitle { get; set; } 
} 

数据是这样的:

ENTITY1:
ID = 1,目标-ID = 1 ,名称= NAME1,JOBTITLE =作业1
ID = 2,目标-ID = 1,名称=名称2,JOBTITLE =作业2
ID = 3, 目标-ID = 2,名称= NAME3,JOBTITLE = JOB3
ID = 4, 目标-ID = 2,名称= NAME4,JOBTITLE = JOB4
编号= 5, 目标-ID = 2,名称= NAME5,JOBTITLE =作业5
实体2:
目标-ID = 1,DestinationName = DESTINATION1
目标-ID = 2,DestinationName = DESTINATION2

我如何选择不同的目标-ID,选择名称和JOBTITLE从ENTITY1然后用ENTITY2加入他们获取目的地名称,并将其送回作为EntityDTO?

+0

@GertArnold我改变了类定义并添加了样本数据。 – Unforgiven

+0

所以如果你选择不同的'DestinationId's,你会错过最终结果中的一些名字和职位。这可以吗? –

+0

是的,没关系。这只是一个测试。我想查看在加入之后或之前如何选择不同的列 – Unforgiven

回答

2

这里有一个办法做到这一点:

var query = from e1 in 
    (from e1 in entities1 
     group e1 by e1.DestinationId into grp 
     select grp.First()) 
    join e2 in entities2 on e1.DestinationId equals e2.DestinationId 
    select new EntityDTO 
      { 
       DestinationId = e1.DestinationId, 
       DestinationName = e2.DestinationName, 
       Name = e1.Name, 
       JobTitle = e1.JobTitle 
      } ; 

诀窍是group by,然后采取分组的第一要素。这也被称为“不同”,像MoreLinq这样的图书馆提供了开箱即用的功能。

0

可以使用LINQ连接操作是这样的:

var results = from e1 in context.Entity1s 
       join e2 in context.Entity2s 
       on e1.DestinationId equals e2.DestinationId 
       select new EntityDTO 
       { 
        DestinationId = e1.DestinationId, 
        Name = e1.Name, 
        JobTitle = e1.JobTitle, 
        DestinationName = e2.DestinationName 
       }; 
+0

哪里有区别?我们可能在Entity1上有多个具有相同destinationId的记录。我们想要防止重复使用Distinct。这样的事情:选择不同的目的地ID ... – Unforgiven

+0

如果你有多个实体具有相同的目的地ID,那么你想要从源表中列出哪个名称和职位名称?首先?最后?你想以某种方式聚合它们吗?您的数据不符合您的预期结果。 –

+0

我没有第一个实体上的DestinationName,这就是为什么我想联合实体有结果上的DestinationName。 – Unforgiven

1

使用LINQ的扩展,我更他们的粉丝的:

var results = entityList1 
      .GroupBy(e => e.DestinationId) 
      .Select(e => e.First()) 
      .Join(entityList2, e1 => e1.DestinationId, e2 => e2.DestinationId, (e1, e2) => 
       new EntityDTO 
       { 
        DestinationId = e1.DestinationId, 
        DestinationName = e2.DestinationName, 
        JobTitle = e1.JobTitle, 
        Name = e1.Name 
       }); 

同样的事情格特的anwser真的。您可以使用Distinct但是,您将不得不从IEquatible<T>继承和实施Equals方法并重写GetHashCode方法以使其工作。