Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# iQueryEnable通过对象属性获取不同的结果_C#_Linq - Fatal编程技术网

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