C# iQueryEnable通过对象属性获取不同的结果
我有一个疑问:C# iQueryEnable通过对象属性获取不同的结果,c#,linq,C#,Linq,我有一个疑问: 来自snd in_context.SenderPhones 其中snd.applicationserid==applicationUser.Id&!删除 选择新的 { SenderPhoneId=snd.SenderPhoneId, 电话 } 我需要找到一种不包括重复电话的方法。查询必须是可查询的,而不是可枚举的。 实现这一目标的最佳和最简单的方法是什么。通常,要获取和删除重复项,您会使用 问题的解决方案取决于您定义的“复制手机”。 如果SenderPhoneId是主键,则不能
来自snd in_context.SenderPhones
其中snd.applicationserid==applicationUser.Id&!删除
选择新的
{
SenderPhoneId=snd.SenderPhoneId,
电话
}
我需要找到一种不包括重复电话的方法。查询必须是可查询的,而不是可枚举的。
实现这一目标的最佳和最简单的方法是什么。通常,要获取和删除重复项,您会使用 问题的解决方案取决于您定义的“复制手机”。 如果
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不同。没有重复的手机。但是,如果您仅选择SenderPhoneId
和Phone
,您将有:
SenderPhoneId Phone
5 xxx (was phone 3)
5 xxx (was phone 4)
5 xxx (was phone 5)
您是否将这些电话定义为同一部电话?如果是这样,只需在末尾添加您的DISTINCE:
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
但如果您说:“不,这三部手机不是同一部手机,其中一些手机有不同的名称,即使我没有选择此属性”,那么您必须首先选择使手机唯一的属性,然后执行不同的操作,最后选择您想要的属性:
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()结合使用,如下所示:
如果存在多个具有相同id的SenderPhone(如果SenderPhone.Phone.id希望它们是唯一的,则只需替换GroupBy中使用的属性),这将返回具有唯一id的SenderPhone列表
如果要确保在存在多个具有相同id的发件人电话时始终使用相同的发件人电话,请在First()
之前添加带有适当排序条件的OrderBy()
?
_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
});