gpt4 book ai didi

sql - Entity Framework 、通用存储库模式和奇怪的 SQL 生成

转载 作者:行者123 更新时间:2023-12-04 23:48:50 27 4
gpt4 key购买 nike

我已经为 Entity Framework 4 实现了一个通用存储库。 这是一个简化版,其中 AllAppContainer 是 EF4 对象上下文:

public class Repository<T> where T : class
{
protected AllAppContainer objectContext;
protected ObjectSet<T> entitySet;

public Repository()
{
objectContext = new AllAppContainer();
entitySet = objectContext.CreateObjectSet<T>();
}

public int QueryCount(Func<T, bool> predicate)
{
int queryCount = entitySet.Count(predicate);
return queryCount;
}
}

一种方法是 QueryCount(),我想用它来充当 选择 Count(*) ... 其中 SQL 行(不返回实际记录)。

直截了当?你会想...首先,让我们做一个非 Repository 版本的同样的事情,对 Item 实体进行计数:
AllAppContainer allAppContainer = new AllAppContainer();
int nonRepCount = allAppContainer.Items.Count(item => item.Id > 0);

SQL Server Profiler 说生成的 SQL 是:
SELECT 
[GroupBy1].[A1] AS [C1]
FROM ( SELECT
COUNT(1) AS [A1]
FROM [dbo].[Items] AS [Extent1]
WHERE [Extent1].[Id] > 0
) AS [GroupBy1]

呜呼!分数!

现在让我们使用我的 Repository QueryCount 调用它:
Repository<Item> repository = new Repository<Item>();
int repCount = repository.QueryCount(item => item.Id > 0);

这是生成的 SQL:
SELECT 
[Extent1].[Id] AS [Id],
[Extent1].[SmallField] AS [SmallField]
FROM [dbo].[Items] AS [Extent1]

是的,EF 正在返回完整的数据集,然后在内存中对其调用 Count()。

为了好玩,我尝试将 Repository QueryCount 中的相关行更改为:
int queryCount = new AllAppContainer().CreateObjectSet<T>().Count(predicate);

和非存储库行:
int nonRepCount = allAppContainer1.CreateObjectSet<Item>().Count(item => item.Id > 0);

但是为每个生成的 SQL 与以前相同。

现在为什么所有这些 repository-returns-all-matching-records-then-counts 会发生,当它不是非存储库时?有什么方法可以通过我的通用存储库做我想做的事情,即在 db.count 上计数。我无法承受内存计数性能的影响。

最佳答案

您需要使用 Expression<Func<TSource, bool>> predicate为您 Count否则框架使用 Enumerable.Count<TSource> Method (IEnumerable<TSource>, Func<TSource, Boolean>)它从 DB 获取整个集合以便能够为每个项目调用,因此您的方法应该是:

public int QueryCount(Expression<Func<T, Boolean>> predicate)
{
int queryCount = entitySet.Count(predicate);
return queryCount;
}

关于sql - Entity Framework 、通用存储库模式和奇怪的 SQL 生成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5007325/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com