实体框架在连接后返回不同的记录
本文关键字:记录 返回 框架 连接 实体 | 更新日期: 2023-09-27 18:15:50
假设我们有两个实体和一个自定义对象:
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, 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,= Name5 DestinationId = 2,名称,职务高低= Job5
实体2:
DestinationId=1, DestinationName=Destination1
DestinationId=2, DestinationName=Destination2
如何从Entity1中选择不同的destinationId并选择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等库提供的开箱即用的"distinct by"。
使用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连接操作符:
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
};