没有运行的LINQ不在“包含”查询中

问题描述:

对此坚持不懈。没有运行的LINQ不在“包含”查询中

简单的查询,但它只是不工作。 我只需要获取当前未分配给任何用户的公司单位。

ID是GUID类型。

调试时,我发现companyUnits中有2个对象,userCompanyUnits中有1个。 我试图让1 companyUnit(不存在userCompanyunit)显示。 相反,我没有得到任何结果。

任何想法查询有什么问题?也许我不能根据指导进行比较?

var companyUnitsList = from x in companyUnits 
         where !(from c in userCompanyUnits 
           select c.CompanyUnit.Id).Contains(x.Id) 
         select x; 

在此先感谢!

+1

您的语法看起来完全正确。你可以运行分析器来查看正在生成的SQL查询吗? –

+1

请尝试使用Except运算符:http://stackoverflow.com/a/183812/138938 –

+0

谢谢。我仍然不知道为什么我和Except方法不适合我,但我只是在知识库中添加了一个新的linq方法。感谢那。 – Shenaniganz

这里是做不使用除了运营商,以及需要自定义的IEqualityComparer的方式:

 List<Tuple<int, string>> allUnits = new List<Tuple<int, string>>(); 
     allUnits.Add(new Tuple<int, string>(1, "unit1")); 
     allUnits.Add(new Tuple<int, string>(2, "unit2")); 
     allUnits.Add(new Tuple<int, string>(3, "unit3")); 

     List<Tuple<int, string>> assignedUnits = new List<Tuple<int, string>>(); 
     assignedUnits.Add(new Tuple<int, string>(2, "unit2")); 

     var unassigned = allUnits.Where(m => !assignedUnits.Any(asgn => asgn.Item1 == m.Item1)); 

//Yields unit1 and unit3 
  • 项目1对应Unit.ID
+0

所有优秀的答案,但这是实际工作的人。谢谢! – Shenaniganz

既然你把它标记为SQL ,我假设这是可查询的并且针对数据库运行。根据ORM和是否已定义和可用的导航性能,你可以这样做:

var notAssigned = 
    from x in companyUnits 
    where x.Users.Any() == false 
    select x; 

督察,无论导航属性或集合存在于公司单位联系到指定的用户(S)为您会用什么在查询中(并且很可能会转换为sql'exists')

+0

有趣的方法,谢谢。但它不适用于我的具体情况。 – Shenaniganz

+0

你总是可以查询那些有用户指定的然后全部执行的查询。除了(areAssigned) –

var list1 = from s in new String[] {"ABC1","ABC2", "ABC3", "ABC4"} select new {Field1=s,Id = Guid.NewGuid().ToString()} ; 
    var list2 = new String[] {"ABC3","ABC4", "ABC5", "ABC6"} ; 


    var requiredList = (from i1 in list1 
        from i2 in list2 
        where !i1.Field1.Contains(i2) 
        select i1).Distinct(); 
+0

不幸的是,该域的where子句中没有Contains方法方法可用 – Shenaniganz