C#ef核心有效地确定查询中是否只有一行



检查特定查询是否有一行且只有一行的最有效方法是什么?.FirstOrDefault((不会达到我的目的,因为我想知道是有两个+还是只有一个结果。

是吗

  1. 通过计数异步
var record = await _FilteredContext.Context.Where(x => x.Criterion == FilterCondition).CountAsync();
var singular = record == 1;
var singular = false;
try
{
var record = await _FilteredContext.Context.SingleOrDefault(x => x.Criterion == 
FilterCondition);
singular = true;
}
catch (Exception ex) {}

还是其他什么?

您可以使用与任何ORM相同的技术-获取两条记录并应用Count

var count = await _FilteredContext.Context
.Where(x => x.Criterion == FilterCondition)
.Take(2)
.CountAsync();
var singular = count == 1;

您有三个选项,这取决于您是否想确切地知道您得到的结果数量,以及是否希望异常来指导逻辑流。

首先是使用Single(或SingleOrDefault(。如果得到多个结果,这将引发异常(SingleOrDefault不会引发0个结果(。

YourModelType resultingObject;
try
{
resultingObject = await _FilteredContext.Context
.Single(x => x.Criterion == FilterCondition);
}
catch
{
// (assuming another error wasn't thrown)
// do something if more than one result
}

在后台,至少对于SqlServer来说,这可以翻译为(大致(

select top 2 *
from YourTable
where Criterion == <param>

生成此SQL的原因是为了防止获取和搜索额外的行。2是检查行计数以确定是否得到"0"的最小数;多于一个";后果如果最多传递2行就足够了,那么将所有行传递回客户端是没有意义的。

第二种选择是自己制作。只有当您only关心是否有0、1或";大于1〃;后果

var queryCount = await _FilteredContext.Context
.Where(x => x.Criterion == FilterCondition)
.Take(2)
.CountAsync();

如果需要对象,可以将CountAsync替换为ToListAsync。然后你只需要一些逻辑来确定你有多少结果,要么是0,要么是1,要么是2。

第三种选择是保留你所拥有的。如果你想知道你得到了多少记录,即使是";大于1〃;。

相关内容

最新更新