编译以下代码时,我会遇到编译时间错误,我看不出为什么:

关系与许多关系是许多关系

 var contacts = groups_to_querry
                .SelectMany(x => x.Contacts)
                .Where(x => x.ID == Guid.Empty)
                .SelectMany(p => p.ContactDetails)
                .Where(x => x.ID == Guid.Empty)
                .SelectMany(x => x.Contacts);  //This line gives me a compile time error 
                //Error : The Type argumetns for method 'System.Linq.Enumerable.SelectMany<TSource,Tresult>
                //(System.Collections.Generic.IEnumerable<TSource>, System.Func<TSource,
                //System.Collections.Generic.IEnumerable<TResult>>)' cannot be infrred from the usage.  
                //Try specifying the type arguments explicitly
有帮助吗?

解决方案

您第二次打电话 .SelectMany(x => x.Contacts), ,您目前正在合作 ContactDetails. 。怀疑您能够使用 SelectMany 在上面。您需要使用 Select 反而。

SelectMany 当您想选择多个项目并将其放入一个时,请使用 IEnumerable. Select 用于单个字段。由于您正在使用类型的对象 ContactDetail (我认为只能有一个联系),您需要使用 Select

编辑:这是简而言之,一步一步:

groups_to_querry.SelectMany(x => x.Contacts): :从我想查询的所有小组中选择他们的所有联系人。每个小组都有许多联系人,因此将它们全部放入一个 IEnumerable 类型的集合 Contact

.Where(x => x.ID == Guid.Empty): :...但是只有那些带有空ID的联系人

.SelectMany(p => p.ContactDetails): :然后选择所有这些联系人的许多ContactDeTails。每个触点都有许多联系尾尾,因此将它们全部放入一个 IEnumerable 类型的集合 ContactDetail

.Where(x => x.ID == Guid.Empty): :...但是只有那些带有空ID的Contactdetails

.SelectMany(x => x.Contacts);: :现在选择每个Contactdetails的许多联系人。但是,由于编译器知道联系人与联系尾尾之间存在一对多关系(而不是相反),因此该语句是不可能的,因此显示了编译错误

其他提示

我将您的预期查询解释为“从多个联系人组中,选择具有ID = GUID的所有联系人,并且具有所有详细信息,并且所有详细信息都具有ID = GUID.EMPTY”。

您的代码的实际解释方式是“来自具有GUID的所有联系人。第一个问题是您最终从详细信息中选择。这意味着决赛 SelectMany 应该是一个 Select, , 因为 x.Contacts 这里是指从细节到联系人的多对一关系。

第二个问题是结果将包含联系人的重复,因为每个详细信息都包含相同的联系人。相反,您应该做的是根据其详细信息收集直接过滤联系人,例如:

groups_to_query
.SelectMany(g => g.Contacts)
.Where(c => c.ID == Guid.Empty)
.Where(c => c.ContactDetails.All(d => d.ID == Guid.Empty))

请注意,这还将选择详细信息的联系人,这与您的查询不同,因此我不确定这是您想要的。您可以添加另一个过滤器 ContactDetails.Any() 如果不。

编辑: 由于您正在使用实体框架,因此上述可能无法正常工作。您可能需要在子查询中选择详细信息,然后在执行后的内存中过滤:

var queryResult =
    groups_to_query
    .SelectMany(g => g.Contacts)
    .Where(c => c.ID == Guid.Empty)
    .Select(c => new {
        contact = c,
        detailIDs = c.ContactDetails.Select(d => d.ID)
    }).ToList();

var contacts =
    queryResult
    .Where(r => r.detailIDs.All(id => id == Guid.Empty))
    .Select(r => r.contact);
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top