iqueryable通过一个对象属性获取不同的结果



我有这样的查询:

from snd in _context.SenderPhones
where snd.ApplicationUserId == applicationUser.Id & !snd.IsDeleted  
select new
{
SenderPhoneId = snd.SenderPhoneId,
Phone = snd.Phone
}

我需要找到一个不包含重复电话的方法。查询必须是可查询且不可枚举的。要做到这一点,最好最简单的方法是什么?

通常要删除重复,您将使用Queryable。不同的

你的问题的解决方案取决于你定义的"重复电话"。

如果SenderPhoneId是主键,那么你不能有两个具有相同SenderPhoneId的手机。因此,如果主键是"重复电话"定义的一部分,那么你就不能有重复的电话。

由于您的问题,我假设SenderPhoneId不是主键,并且具有不同主键的两个电话可能具有相同的属性SenderPhoneId值。

所以你可以有这样的电话:

Id    SenderPhoneId     Phone     ApplicationUserId    IsDeleted     Name
3         5             xxx             10               false     "John"    
4         5             xxx             10               false     "John"
5         5             xxx             10               false     "Mary"

这三部手机有不同的Id。没有重复的电话。但是,如果只选择SenderPhoneIdPhone,则会有:

SenderPhoneId     Phone
5             xxx        (was phone 3)
5             xxx        (was phone 4)         
5             xxx        (was phone 5)

你把这些手机定义为同一部手机吗?如果是,只需在末尾加上你的区别符:

int applicationUserId = ...
var uniqueSenderPhones = dbContext.SenderPhones
.Where(senderPhone => senderPhone.ApplicationUserId == applicationUserId
&& !senderPhone.IsDeleted)
.Select(senderPhone => new
{
SenderPhoneId = senderPhone.SenderPhoneId,
Phone = senderPhone.Phone,
})
.Distinct();

这个例子将只剩下一个电话:

SenderPhoneId      Phone
5               xxx

但是如果你说:"不,这三个手机不是同一部手机,其中一些有不同的名字,即使我没有选择这个属性",那么你首先要选择使手机唯一的属性,然后做Distinct,最后选择你想要的属性:

var uniqueSenderPhones = dbContext.SenderPhones
.Where(senderPhone => senderPhone.ApplicationUserId == applicationUserId
&& !senderPhone.IsDeleted)
.Select(senderPhone => new
{
Name = senderPhone.Name,
SenderPhoneId = senderPhone.SenderPhoneId,
Phone = senderPhone.Phone,
})
.Distinct()
.Select(senderPhone => new
{
SenderPhoneId = senderPhone.SenderPhoneId,
Phone = senderPhone.Phone,
});

在这个例子中,你会得到:

SenderPhoneId     Phone
5             xxx        (was phone 3 or 4)
5             xxx        (was phone 5)

您可以像这样将GroupBy()与First()组合使用:

_context.SenderPhones
.Where(senderPhone => senderPhone.ApplicationUserId == applicationUser.Id &&
!senderPhone .IsDeleted)
.GroupBy(senderPhone => senderPhone.SenderPhoneId)
.Select(sernderPhones => senderPhones.First())
.Select(senderPhone => new 
{ 
SenderPhoneId = senderPhone.SenderPhoneId,
Phone = senderPhone.Phone 
});

如果存在多个具有相同id的senderphone,则应该返回具有唯一id的senderphone列表,总是取第一个(如果您希望它们具有唯一的SenderPhone.Phone.Id,则只需替换GroupBy中使用的属性)。

如果你想确保总是使用相同的发送者电话,如果存在多个相同的id,那么在First()之前添加一个OrderBy()和一个适当的排序条件。

相关内容

  • 没有找到相关文章