Entity framework LINQ到实体查询以验证所有行是否存在
我需要验证数据库中是否存在给定集合中的所有行,以及当前用户是否有权访问所有行我想在对数据库的单个查询中执行此操作,类似于Entity framework LINQ到实体查询以验证所有行是否存在,entity-framework,linq,Entity Framework,Linq,我需要验证数据库中是否存在给定集合中的所有行,以及当前用户是否有权访问所有行我想在对数据库的单个查询中执行此操作,类似于.All()查询,但我不能想出正确的语法(可能不可能) 代码的迭代版本如下所示: bool canAccess; foreach(var taskId in taskIds) { canAccess = await DataContext.WorkTasks.AnyAsync(wt => wt.DealerId == dealerId && wt.
.All()
查询,但我不能想出正确的语法(可能不可能)
代码的迭代版本如下所示:
bool canAccess;
foreach(var taskId in taskIds)
{
canAccess = await DataContext.WorkTasks.AnyAsync(wt => wt.DealerId == dealerId && wt.Id == taskId);
if(!canAccess) break;
}
我在想这样的事情:
var canAccess = await DataContext.WorkTasks.AllAsync(wt => wt.DealerId == dealerId && taskIds.Contains(wt.Id));
但我不认为这是我想要的。这可以使用LINQ来完成吗?组合成一个查询:
var q = DataContext.WorkTasks.Take(0); // setup q to right type
foreach (var taskId in taskIds)
q = q.Concat(DataContext.WorkTasks.Where(wt => wt.Id == taskId && wt.DealerId == dealerId));
var canAccess = (taskIds.Count() == q.Count());
要合并为单个查询,请执行以下操作:
var q = DataContext.WorkTasks.Take(0); // setup q to right type
foreach (var taskId in taskIds)
q = q.Concat(DataContext.WorkTasks.Where(wt => wt.Id == taskId && wt.DealerId == dealerId));
var canAccess = (taskIds.Count() == q.Count());
大概是这样的:
var dbCount = await DataContext.WorkTasks.Where(wt => wt.DealerId == dealerId && taskIds.Contains(wt.Id)).Count();
将向服务器发送所有ID并计算匹配行数。类似于以下内容:
var dbCount = await DataContext.WorkTasks.Where(wt => wt.DealerId == dealerId && taskIds.Contains(wt.Id)).Count();
将向服务器发送所有ID并计算匹配行。这不是对
taskIds
的正确测试。使用Async并立即执行等待
有什么特别的原因吗?@NetMage-抱歉,我不知道你在问什么。为什么你要使用AnyAsync
而不仅仅是Any
?@NetMage来提高iist中的线程使用率,这不是对taskIds
的正确测试。有什么特别的原因要使用Async和立即的wait
?@NetMage-对不起,我不知道你在问什么。为什么你要使用AnyAsync
,而不是仅仅使用Any
?@NetMage在IIST中更好地使用线程?这与我现在的情况基本相同,它以多次往返数据库结束。对不起,我错过了往返问题。只要taskIds很小,它就应该可以工作。类型设置的轻微改进有助于更好地进行SQL翻译。taskIds
可以有20-30个项目,理论上要多很多,但实际上不太可能多。q.Concat()
很有趣,这背后的目的是什么(与David在回答中所做的相反)?David的答案更好,但我非常害怕局部序列导致LINQ到SQL的翻译问题,所以我并不总是想使用它们。他对的使用包含了翻译成好的SQL,我认为。这与我现在所做的基本相同,它以多次往返数据库结束。对不起,我错过了往返问题。只要taskIds很小,它就应该可以工作。类型设置的轻微改进有助于更好地进行SQL翻译。taskIds
可以有20-30个项目,理论上要多很多,但实际上不太可能多。q.Concat()
很有趣,这背后的目的是什么(与David在回答中所做的相反)?David的答案更好,但我非常害怕局部序列导致LINQ到SQL的翻译问题,所以我并不总是想使用它们。我认为他使用的包含
翻译成好的SQL。我有时会在本地列表上看到包含
,导致LINQ到SQL中出现错误,但这似乎翻译得很好。我实际上使用了@NetMage和@DavidBrowne-answer的组合,但David的最接近我实际使用的代码。David的答案只是缺少数据库计数与taskIds.count
的比较。谢谢各位。我有时会在本地列表中看到。包含,导致LINQ到SQL中出现错误,但这似乎翻译得很好。我实际上使用了@NetMage和@DavidBrowne answer的组合,但David的最接近我实际使用的代码。David的答案只是缺少数据库计数与taskIds.count
的比较。谢谢各位。