实体框架中的通用存储库模式
本文关键字:存储 模式 框架 实体 | 更新日期: 2023-09-27 17:51:14
我是通用存储库模式的新手。我尝试创建一个使用通用存储库添加、更新、删除和查找方法的示例。找到我的示例代码,
通用存储库接口和类:
public interface IRepository<T> : IDisposable where T : class
{
IEnumerable<T> Find(Func<T, bool> predicate);
void Add(T entity);
void SaveChanges();
}
public class DataRepository<T> : IRepository<T> where T : class
{
private ObjectContext _context;
private IObjectSet<T> _objectSet;
public DataRepository(ObjectContext context)
{
_context = context;
_objectSet = _context.CreateObjectSet<T>();
}
public IEnumerable<T> Find(Func<T, bool> predicate)
{
return _objectSet.Where(predicate);
}
public void Add(T entity)
{
_objectSet.AddObject(entity);
}
}
我使用了如下方法
DataRepository<tblUser> _tblUser = new DataRepository<tblUser>(new SampleRepositoryEntities());
DataRepository<TestingTable> sampleRepository = new DataRepository<TestingTable>(new SampleRepositoryEntities());
public void GetRecords()
{
var record1 = sampleRepository.Find(f => f.id == 1).FirstOrDefault();
var record = _tblUser.Find(f => f.emailid == "karthik@abc.com").FirstOrDefault();
}
我可以找到使用查找方法从表"TestingTable"在sampleerepositoryentities的记录。因为这个表的记录非常少,只有10条左右。
但是我试图从tbluser表中找到匹配email id的第一个记录,这个表有超过50,000条记录,我无法得到结果,此时继续加载,也没有任何异常。我做错了什么…谁能让我清理一下这个?
每当我用EF实现通用存储库时,我使用Expression<Func<T, bool>>
而不是Func<T, bool>
作为谓词。
我认为在您的情况下发生的事情是在应用谓词之前检索所有50,000条记录。相反,只需更改
public IEnumerable<T> Find(Func<T, bool> predicate)
public IEnumerable<T> Find(Expression<Func<T, bool>> predicate)
,看看这是否能提高性能。
编辑:为了进一步阐述@ashutoshraina的观点,我决定测试这两种方法,看看生成了什么SQL。使用老的北风数据库,我发现了以下内容:
查询Where(Func< T, bool>)
using (ConsoleApplication2.NorthwindEntities entities =
new ConsoleApplication2.NorthwindEntities())
{
Func<Product, bool> f = (p => p.Discontinued);
var result = entities.Products.Where(f).ToList();
}
生成了以下SQL
SELECT [Extent1].[ProductID] AS [ProductID],
[Extent1].[ProductName] AS [ProductName],
[Extent1].[SupplierID] AS [SupplierID],
[Extent1].[CategoryID] AS [CategoryID],
[Extent1].[QuantityPerUnit] AS [QuantityPerUnit],
[Extent1].[UnitPrice] AS [UnitPrice],
[Extent1].[UnitsInStock] AS [UnitsInStock],
[Extent1].[UnitsOnOrder] AS [UnitsOnOrder],
[Extent1].[ReorderLevel] AS [ReorderLevel],
[Extent1].[Discontinued] AS [Discontinued]
FROM [dbo].[Products] AS [Extent1]
查询Where(Expression<Func< T, bool>>)
using (ConsoleApplication2.NorthwindEntities entities =
new ConsoleApplication2.NorthwindEntities())
{
Expression<Func<Product, bool>> f2 = (p => p.Discontinued);
var result2 = entities.Products.Where(f2).ToList();
}
生成如下SQL:
SELECT [Extent1].[ProductID] AS [ProductID],
[Extent1].[ProductName] AS [ProductName],
[Extent1].[SupplierID] AS [SupplierID],
[Extent1].[CategoryID] AS [CategoryID],
[Extent1].[QuantityPerUnit] AS [QuantityPerUnit],
[Extent1].[UnitPrice] AS [UnitPrice],
[Extent1].[UnitsInStock] AS [UnitsInStock],
[Extent1].[UnitsOnOrder] AS [UnitsOnOrder],
[Extent1].[ReorderLevel] AS [ReorderLevel],
[Extent1].[Discontinued] AS [Discontinued]
FROM [dbo].[Products] AS [Extent1]
WHERE [Extent1].[Discontinued] = 1
这表明使用Expression<Func<T, bool>>
方法生成的查询考虑到谓词,从而让SQL Server做更多的工作,这将倾向于解释您正在使用Func<T, bool>
遇到的问题。