LINQ一切正常

本文关键字:LINQ | 更新日期: 2023-09-27 17:50:43

我有一个类:

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?

LINQ一切正常

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

尝试:而不是Contains

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

并尝试通过确保此条件真的为true来调试它。

我不确定我是否完全了解您的使用场景,但假设您想检查每个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");
}