我在我当前的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'。
3条答案
按热度按时间q7solyqu1#
这个很好用
你确定吗
字符串
这不应该是:
型
无论如何,如果你所有的实体都有一个整数ID属性,为什么不让它们都实现一个接口呢?
型
然后你将把你的泛型T参数约束到基本仓库中的这个接口,你就知道如何写lambda了。
wh6knrhe2#
EF6有一个
Find()
方法,可以满足您的需要。http://msdn.microsoft.com/en-us/library/gg696418(v=vs.113).aspx
字符串
不要担心它加载了比需要的更多的连接表(包括)。对于单个记录来说,这不是什么大不了的事情。EDIT:对不起,
Find
实际上并不做任何自己的即时加载。只有当上下文已经跟踪了相关实体时,才会返回相关实体。qcuzuvrc3#
这是我使用表达式的方法
字符串