linq 一般存储库中的SingleOrDefault?

s2j5cfk0  于 12个月前  发布在  其他
关注(0)|答案(3)|浏览(130)

我在我当前的web API项目中使用EF6实现了仓库模式。目前,我有以下函数(在CustomerRepository中)返回客户:

public override Customer Get(int id, params Expression<Func<Customer , object>>[] include)
    {
        if (include.Any())
        {
            var set = include.Aggregate<Expression<Func<Customer , object>>, IQueryable<Customer >>
                        (dbset, (current, expression) => current.Include(expression));

            return dbset.SingleOrDefault(x => x.Id == id)
        }

        return dbset.Find(id);
    }

字符串
这很好用,但是我想把上面的方法移到我的通用仓库中。这里的问题是SingleOrDefault,因为T的Id是未知的。
有没有办法解决这个问题?我需要实现一个接口吗?
作为一个侧面,我的所有实体的第一个属性是'int Id'。

q7solyqu

q7solyqu1#

这个很好用
你确定吗

return dbset.SingleOrDefault(x => x.Id = id)

字符串
这不应该是:

return dbset.SingleOrDefault(x => x.Id == id)


无论如何,如果你所有的实体都有一个整数ID属性,为什么不让它们都实现一个接口呢?

public interface IEntity
{
    int Id { get; }
}


然后你将把你的泛型T参数约束到基本仓库中的这个接口,你就知道如何写lambda了。

wh6knrhe

wh6knrhe2#

EF6有一个Find()方法,可以满足您的需要。
http://msdn.microsoft.com/en-us/library/gg696418(v=vs.113).aspx

public T Get(int id)
{
    return dbset.Find(id);
}

字符串
不要担心它加载了比需要的更多的连接表(包括)。对于单个记录来说,这不是什么大不了的事情。EDIT:对不起,Find实际上并不做任何自己的即时加载。只有当上下文已经跟踪了相关实体时,才会返回相关实体。

qcuzuvrc

qcuzuvrc3#

这是我使用表达式的方法

public class EfGenericService<TEntity, TKey> : IGenericService<TEntity, TKey>
           where TEntity : class
    {
        private readonly ApplicationDbContext _dbContext;
        private readonly DbSet<TEntity> _entities;
        public EfGenericService(ApplicationDbContext context)
        {
        _dbContext = context ?? throw new ArgumentException(nameof(context));
        _entities = _dbContext.Set<TEntity>();

    }
    public async Task<TEntity?> FindSingleAsync(Expression<Func<TEntity, bool>>predicate)
    {
        return await _entities.SingleOrDefaultAsync(predicate);
    }
    }

字符串

相关问题