2011-04-20 42 views
1

我有一個類:LINQ的所有條件

Public Class Task 
{ 
    Public Guid TaskId { get ; set } 
    Public Guid ParentId { get ; set } 
    ... 
} 

而另一類:

Public Class ContractDetail 
{ 
    Public Guid ContractDetailsID {get;set} 
    Public Guid TaskId { get;set} 
    ... 
} 

我要檢查,如果所有的任務都ContractDetail然後做一些事情,我寫此查詢:

List<Guid> Sids = new List<Guid>(); 
Sids = Tasks.Where(p => p.ParentId == ParentId).Select(p => p.TaskId).ToList(); 
if(ContractDetails.All(p => Sids.Contains(p.TaskId)) 
{ 
     int i = 5; 
     ..... 
} 

但它總是返回false。

如何檢查所有任務是否有ContractDetails?

+0

如何使用** TrueForAll ** – V4Vendetta 2011-04-20 08:06:07

+0

我用TrueForAll替換了所有,它返回false,它認爲問題是使用Contains條件。 – Shayan 2011-04-20 08:12:38

+0

你不需要通過使用** ToString()**來比較它嗎? – V4Vendetta 2011-04-20 08:17:01

回答

6
bool allTasksHaveContractDetails = Tasks.All(t => ContractDetails.Any(cd => cd.TaskId == t.TaskId)) 

另一種方法:

var query = 
    from t in Tasks 
    join cd in ContractDetails on t.TaskId equals cd.TaskId into tmp 
    select tmp; 

bool allTasksHaveContractDetails = query.All(x => x.Any()); 
+0

Tnx爲您的良好迴應但是,因爲我想檢查一個兒童的列表,我將其更改爲:Sids.All(y => ContractDetails.Any(cd => cd.TaskId == y)) – Shayan 2011-04-20 08:44:01

0

而是包含,嘗試:

Sids.Any(s => s.Equals(p.SakhtarId)) 

,並嘗試通過確保這種情況下確實應該如此進行調試。

+0

我困惑,我想比較不在子列表上的任務。 – Shayan 2011-04-20 08:36:12

0

我不知道如果我完全讓你的使用場景,但假設你要檢查每一個Task有一個相關的ContractDetail,即ContractDetailTask具有相同TaskId,您可以選擇的唯一ID從兼具收藏和使用IEnumerable.SequenceEquals像這樣:

var tids = tasks.OrderBy(t => t.TaskId).Select(t => t.TaskId).Distinct(); 
var ctids = details.OrderBy(c => c.TaskId).Select(c => c.TaskId).Distinct(); 

if (tids.SequenceEqual(ctids)) 
{ 
    Console.WriteLine("Every task has a contract"); 
} 
+0

Tnx沒關係,但我認爲有一個更好的解決方案,因爲可能是2名單有很多成員和比較列表不是很好。 – Shayan 2011-04-20 08:45:44

+0

它比'Tasks'的* *每個元素都要超過'ContractDetails'並且尋找匹配的'TaskId'要快。 – Alex 2011-04-20 09:47:46