c# - Entity Framework Core——是否需要检查查询是否可以返回结果
问题描述
考虑以下代码片段:
public async Task<List<MyModel>> GetAllForIds(IList<Guid> ids)
{
// query the database for entities which have a field that matches one of the ids,
// then map those entities to models and return.
}
如果 id 列表为空,则显然查询不会返回任何内容,因此最好不要费心联系数据库。我的问题是 EF Core 是否足够聪明,可以自己解决这个问题。如果不是,并且如果可能有一个空的 id 列表,我应该将上面的内容更改为如下所示:
public async Task<List<MyModel>> GetAllForIds(IList<Guid> ids)
{
if (ids.Any())
{
// query the database for entities which have a field that matches one of the ids,
// then map those entities to models and return.
}
else
{
return new List<MyModel>();
}
}
解决方案
如果您想在确定不会返回任何数据时防止数据库往返,您必须自己做。
EF core 甚至去掉了这方面的一些“聪明”。在“经典” EF6中,当执行类似...的查询时
Products.Where(p => false)
...检测到该Where
语句的计算结果为false
(即使这有点困难,并且在您的情况下也有一个空集合),并且它向数据库发送一个虚拟查询。就像是:
SELECT
CAST(NULL AS int) AS [C1],
CAST(NULL AS varchar(1)) AS [C2],
CAST(NULL AS int) AS [C3],
CAST(NULL AS decimal(18,2)) AS [C4],
CAST(NULL AS datetime2) AS [C5],
...
FROM ( SELECT 1 AS X ) AS [SingleRowTable1]
WHERE 1 = 0
所以数据库几乎不会注意到它。但它仍然是一个往返。我不知道为什么 EF6 会这样做,而它看起来很聪明,知道它可能会IQueryable
立即返回一个空的。
EF-core停止发送这个虚拟查询。它确实检测到谓词的计算结果为false
,但随后它只是生成如下查询:
SELECT [p].[Id], etc., etc.
FROM [Products] AS [p]
WHERE 0 = 1
我对此很满意。所有内置的智能都会带来在特定情况下过于智能的风险,这些情况在弹出之前被忽略。我要求 EF 执行查询,它确实执行了。很好很简单。
推荐阅读
- javascript - 在 html 中嵌入本地 asciinema 文件
- java - 如何从两个创建一个新数组并根据原始数组中的值初始化新数组
- keycloak - 在 Keycloak 中没有为孩子错误找到 publicKey 是什么意思
- python - 将 Pytorch 预训练模型部署到 Movidius 神经计算棒
- html - 如何添加行和删除行再次计算?
- minizinc - 为什么我的数组是 var int 类型而不是 var set of int?
- regex - 如何使用 sed 在两个模式之间插入 ']['?
- firebase - React Chrome 扩展中的 Firebase 身份验证
- c++ - 在 x 秒后调用函数,同时在 C++ 中继续运行程序的其余部分
- pyspark - Databricks:writeStream 不处理数据