gpt4 book ai didi

c# - 使用预加载的存储库通用方法 GetById

转载 作者:太空宇宙 更新时间:2023-11-03 23:10:33 24 4
gpt4 key购买 nike

我正在使用 Entity Framework 并希望在 Repository 类中创建通用的 GetById 方法并进行预加载:

这是我使用延迟加载的方法:

public virtual TEntity GetById(object id)
{
return DbSet.Find(id);
}

我知道Find方法不支持预加载,但是如何修改这个方法来使用预加载,所以我使用这个方法如下(举个例子):

_unitOfWork.MyRepository.GetById(includeProperties: "Users");

最佳答案

一种可能的方法是将 FirstOrDefaultDbSetInclude 的谓词一起使用。使用 Expression.Equal 手动构建谓词并不难方法,但主要的挑战是如何获取关键属性名称。幸运的是,我们可以使用一些 ObjectContext 方法来做到这一点,所以实现可能是这样的(假设我们可以访问具体的 DbContext 实例):

public virtual TEntity GetById(object id, params string[] includeProperties)
{
var propertyName = ((System.Data.Entity.Infrastructure.IObjectContextAdapter)DbContext).ObjectContext
.CreateObjectSet<TEntity>().EntitySet.ElementType.KeyMembers.Single().Name;

var parameter = Expression.Parameter(typeof(TEntity), "e");
var predicate = Expression.Lambda<Func<TEntity, bool>>(
Expression.Equal(
Expression.PropertyOrField(parameter, propertyName),
Expression.Constant(id)),
parameter);

var query = DbSet.AsQueryable();
if (includeProperties != null && includeProperties.Length > 0)
query = includeProperties.Aggregate(query, System.Data.Entity.QueryableExtensions.Include);
return query.FirstOrDefault(predicate);
}

关于c# - 使用预加载的存储库通用方法 GetById,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39372237/

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