gpt4 book ai didi

c# - 需要一个接受实体 ID 并包含的通用 EF 方法

转载 作者:行者123 更新时间:2023-11-30 14:34:15 25 4
gpt4 key购买 nike

我正在使用 Entity Framework 5 并有一个通用存储库,其中有几种方法,例如下面的两个 Get() 方法:

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

public TEntity Get(
Expression<Func<TEntity, bool>> filter = null,
IEnumerable<string> includePaths = null)
{
IQueryable<TEntity> query = DbSet;

if (filter != null)
{
query = query.Where(filter);
}

if (includePaths != null)
{
query = includePaths.Aggregate(query, (current, includePath) => current.Include(includePath));
}

return query.SingleOrDefault();
}

这些都非常有用,但是当我想进行稍微复杂一点的 GetById() 调用并同时检索一些实体引用时,如下所示:

var user = _userRepository.GetById(
id,
new List<string> { "Roles", "Invoices" });

我最终不得不为每个实体推出特定于实体(因此非通用)的 GetById(id, includes) 调用,以便我可以在 lambda 中访问它们的特定 Id 字段,即 UserId 或 InvoiceId 等。

public User GetById(
int id,
IEnumerable<string> includes)
{
return Get(
(u => u.UserId == id),
includes);
}

以我一般的 EF 技能,我似乎无法弄清楚如何以通用方式将 DbSet.Find(id) 的优点与 .Include() 调用结合起来。

所以问题是 - 有没有一种方法可以编写一个通用的 EF 方法,我可以使用它来通过它的 id 获取实体并包含一些引用,进而消除编写特定于实体的 GetById(id, includes) 的需要像我上面那样调用。

提前致谢。

最佳答案

这是我在通用存储库中的做法:

    public T GetBy(Expression<Func<T, bool>> predicate, params Expression<Func<T, object>>[] includes)
{
var result = GetAll();
if (includes.Any())
{
foreach (var include in includes)
{
result = result.Include(include);
}
}
return result.FirstOrDefault(predicate);
}

请注意,这是使用 lambda includes 和 FirstOrDefault 而不是 find,但结果是一样的。

您可以查看我的通用存储库的完整源代码 here .

您可以通过以下方式调用它:

var entity = myRepository.GetBy(e=>e.Id == 7, /*Includes*/ e=> e.ANavigationProperty, e=>e.AnotherNavProperty);

编辑:

我不再使用通用存储库,而是使用扩展方法动态构建查询。我发现这得到了更好的重用。 (请参阅此处关于 Composable Repositories 的文章)

关于c# - 需要一个接受实体 ID 并包含的通用 EF 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14345533/

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