2013-05-28 55 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方法以使其工作。