Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework LINQ到实体查询以验证所有行是否存在_Entity Framework_Linq - Fatal编程技术网

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
的比较。谢谢各位。