检查特定查询是否有一行且只有一行的最有效方法是什么?.FirstOrDefault((不会达到我的目的,因为我想知道是有两个+还是只有一个结果。
是吗
- 通过计数异步
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〃;。