【发布时间】:2020-10-15 16:32:25
【问题描述】:
错误地标记为重复 - 请参阅下面的答案
基本设置 - 我有一个应用程序上下文和一个作为 DAO 构建的抽象:
某个实体:
public class SomeEntity
{
public string MyProp { get; set; }
}
数据库上下文:
public class ApplicationContext : DbContext
{
public DbSet<SomeEntity> SomeEntities { get; set; }
/* Rest of the DbContext doesn't matter. */
}
道:
public class DAO
{
private readonly DbSet<SomeEntity> _dbSet;
public DAO(ApplicationContext context)
{
_dbSet = context.SomeEntities;
}
public IEnumerable<SomeEntity> Where(Func<SomeEntity, bool> predicate)
{
return _dbSet.Where(predicate);
}
}
用法:
Dao dao = new Dao(/* whatever for instantiation */);
var results = dao.Where(e => e.MyProp == "my string");
预期行为: 我希望 EF Core 生成如下 SQL 查询:
SELECT [e].MyProp
FROM [TABLE_NAME] AS [e]
WHERE [e].MyProp = 'my string'
实际行为: EF Core 生成以下 SQL 查询:
SELECT [e].MyProp
FROM [TABLE_NAME] as [e]
它省略了 where 子句,导致应用程序在过滤之前将每条记录拉入内存。
为什么?
【问题讨论】:
-
@GSerg - 是的 - 它是相关的!感谢您的参考,希望我能在两天前找到它!
-
停止将其标记为要关闭或重复的内容 - 搜索“EF Core Missing Where Clause”时不会弹出其他问题,这是为了能够搜索而不是一些EF Core 深处的晦涩问题。
-
这个话题并不新鲜,已经讨论过很多次了,还有floating point math和sql injections。我个人认为它不值得一个新的单独的自我回答问题,你认为否则,没问题。你自己说另一个问题涵盖了这个问题,这足以成为同意近距离投票的理由。 [...]
-
[...] 我们在这里love duplicates。关闭一个重复的问题不是惩罚。问题本身不会被删除,并且可以很好地增加关键字的种类,使用这些关键字可以找到原始内容。
-
此问题并非特定于 EF Core,它一直存在于 since Linq2Sql 周围。我选择了这个特定的问题,因为它本身就是另外两个问题的重复,方便地放在它的顶部:stackoverflow.com/q/793571/11683 和 stackoverflow.com/q/252785/11683,这很好地将您带到stackoverflow.com/a/34606818/11683。
标签: c# sql linq .net-core entity-framework-core