gpt4 book ai didi

c# - EF 通用存储库多个包含

转载 作者:行者123 更新时间:2023-11-30 19:23:46 25 4
gpt4 key购买 nike

想法是拥有一个适用于所有实体的通用存储库。我做到了这一点,但是如果我需要一种方法来包含一个或多个其他实体,那对我来说就有问题了。我在代码中加入了一些想法,但这对我不起作用。我也一直在考虑在 EF 中使用聚合函数,但我从未使用过。有人可以指导我如何管理这个吗?

  public interface IRepository<T> where T : BaseEntity
{
IEnumerable<T> GetAll();
T Get(Int64 id);
void Insert(T entity);
void Delete(T entity);
Task<bool> SaveChangesAsync();
T SearchByName(Expression<Func<T, bool>> predicate);
IEnumerable<T> GetAll(string[] includes);

}



public class Repository<T> : IRepository<T> where T : BaseEntity
{
private Entities.AppContext _context;
private DbSet<T> entities;

public Repository(Entities.AppContext context)
{
_context = context;
entities = _context.Set<T>();
}

public void Delete(T entity)
{
if (entity == null)
{
throw new ArgumentNullException("entity");
}
entities.Remove(entity);
}

public T Get(long id)
{
return entities.SingleOrDefault(s => s.Id == id);
}

public IEnumerable<T> GetAll()
{
return entities.ToList();
}

public IEnumerable<T> GetAll(string[] includes)
{
foreach (string include in includes)
{
entities.Include(include);
}
return entities;
}

public void Insert(T entity)
{
if (entity == null)
{
throw new ArgumentNullException("entity");
}
entities.Add(entity);
}

public async Task<bool> SaveChangesAsync()
{
try
{
return (await _context.SaveChangesAsync()) > 0;
}
catch (Exception ex)
{

return false;
}

}

public T SearchByName(Expression<Func<T, bool>> predicate)
{
return entities.Where(predicate).SingleOrDefault();
}
}

最佳答案

您已经陷入了一个典型的陷阱,即调用一个返回某些内容并忽略结果的方法。 entities.Include(include); 行什么都不做——类似于 entities.Where(...);, entities.Select(...);

正确的代码是这样的:

var query = entities.AsQueryable();
foreach (var include in includes)
query = query.Include(include);
return query;

或单行Aggregate :

return includes.Aggregate(entities.AsQueryable(), (query, path) => query.Include(path));

关于c# - EF 通用存储库多个包含,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45321434/

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