通用存储库中的SingleOrDefault?

时间:2014-10-29 07:49:30

标签: c# linq asp.net-web-api

我使用EF6在当前的web api项目中实现了存储库模式。目前,我有以下函数(在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,因为Id不会为T所知。

有没有办法解决这个问题?我需要实现一个接口吗?

另一方面,我所有实体的第一个属性是&#39; int Id&#39;。

2 个答案:

答案 0 :(得分:1)

  

这很好用,

嗯,你确定吗:

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

不应该是:

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

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

public interface IEntity
{
    int Id { get; }
}

然后你将通用T参数约束到基础仓库中的这个接口,你将知道如何编写lambda。

答案 1 :(得分:1)

EF6有Find()方法,可以满足您的需要。

http://msdn.microsoft.com/en-us/library/gg696418(v=vs.113).aspx

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

不要担心它会加载比所需更多的连接表(包括)。对于单一唱片来说,这并不是什么大不了的事。编辑:对不起,Find实际上没有任何自己的热切加载。仅当相关实体已被上下文跟踪时才会返回相关实体。