【问题标题】:What is the difference between IQueryable .Where and IQueryable.Except?IQueryable .Where 和 IQueryable.Except 有什么区别?
【发布时间】:2016-12-08 19:38:07
【问题描述】:

我尝试使用 except 方法。我认为这种方法更强大,并且比 WHERE 子句生成更清晰的 SQL,但不是。它生成相同的sql。

那么为什么/什么时候使用Except方法呢?

编辑:这是一个示例:

// Get customers except those which ID are in the LostCustomers table
TblCustomers.Except(TblCustomers.Where(tj => LostCustomers.Select(lj => lj.CustomerId).Contains(tj.CustomerID))).Select(j => new
{
    CustomerId = j.CustomerID,
    CustomerRef = j.CustomerRef,
    CustomerName = j.Name
})

// Get customers except those which ID are in the LostCustomers table
TblCustomers.Where(tj => !LostCustomers.Select(lj => lj.CustomerId).Contains(tj.CustomerID)).Select(j => new
{
    CustomerId = j.CustomerID,
    CustomerRef = j.CustomerRef,
    CustomerName = j.Name
})

谢谢

【问题讨论】:

  • 这两种方法完全不同。您是在谈论具有特定条件的Where 吗?
  • 您能否举例说明如何使用每个 SQL 获得相同的 SQL。

标签: c# linq linq-to-entities where except


【解决方案1】:

根据您认为它会产生什么 SQL 来选择 LINQ 模式很少值得。取而代之的是,使用似乎可以为您提供最清晰代码的任何方法。例如,在这种情况下,我会认为 except 更清楚:

var taskIds = db.Tasks.Select(task => task.Id);
var doneTaskIds = db.TaskCompletions.Select(tc => tc.TaskId);

var unfinishedTaskIds = taskIds.Except(doneTaskIds);

相对于:

var unfinishedTaskIds = taskIds.Where(id => !doneTaskIds.Contains(id));

但是在很多很多情况下Where() 更有意义。很可能,在上面的例子中,你可以这样说,这样会更清楚:

var unfinishedTasks = db.Tasks.Where(task => !task.TaskCompletions.Any());

【讨论】:

  • 是的,我同意,但最后 Where 更容易使用,因为我们可以在签名中传递谓词。限制较少
  • 是的,Where 更加灵活。
  • PS——在这种情况下,“最终”、“最终”或“当一切都说完了”将是比“最终”更好的词选择。 (我假设你是直接从 finalement 翻译过来的,n'est ce pas?)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-26
  • 2010-11-15
  • 1970-01-01
  • 2018-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多