簡體   English   中英

實體框架在加入后返回不同的記錄

[英]Entity Framework returning distinct records after join

考慮我們有這兩個實體和一個自定義對象:

    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; }
}

數據是這樣的:

實體1:
Id = 1,DestinationId = 1,Name = Name1,JobTitle = Job1
Id = 2,DestinationId = 1,Name = Name2,JobTitle = Job2
Id = 3,DestinationId = 2,Name = Name3,JobTitle = Job3
Id = 4,DestinationId = 2,Name = Name4,JobTitle = Job4
Id = 5,DestinationId = 2,Name = Name5,JobTitle = Job5
實體2:
DestinationId = 1,DestinationName = Destination1
DestinationId = 2,DestinationName = Destination2

如何選擇不同的destinationId並從Entity1中選擇Name和JobTitle,然后將它們與Entity2結合起來以獲取目標名稱並將其作為EntityDTO返回?

這是一種方法:

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之類的庫提供了開箱即用的功能。

使用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
                });

確實和Gert的答案相同。 可以使用Distinct但是必須從IEquatible<T>繼承並實現Equals方法,並重寫GetHashCode方法以使其起作用。

您可以像這樣使用LINQ join運算符:

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
              };

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM