2012-05-11 52 views
1

對此堅持不懈。沒有運行的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

回答

1

這裏是做不使用除了運營商,以及需要自定義的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

1

既然你把它標記爲SQL ,我假設這是可查詢的並且針對數據庫運行。根據ORM和是否已定義和可用的導航性能,你可以這樣做:

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

督察,無論導航屬性或集合存在於公司單位聯繫到指定的用戶(S)爲您會用什麼在查詢中(並且很可能會轉換爲sql'exists')

+0

有趣的方法,謝謝。但它不適用於我的具體情況。 – Shenaniganz

+0

你總是可以查詢那些有用戶指定的然後全部執行的查詢。除了(areAssigned) –

1
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