我正在使用带有工作单元+存储库模式的EF4.3。
我有一个方法可以作为其他方法的基础,这里是代码的外观。
这是我的“基础”方法:
public static IQueryable<Deal> FindActive()
{
var r = new ReadRepo<Deal>(Local.Items.Uow.Context);
return r.Find(d =>
d.ActiveFrom <= DateTime.Now &&
(d.ActiveUntilComputed == null || d.ActiveUntilComputed > DateTime.Now) &&
d.Published);
}
以下是调用基本方法的方法之一:
public static IQueryable<Deal> FindActiveByStore(int storeId)
{
Guard.Default(storeId, "storeId");
return FindActive().Where(d => d.StoreId == storeId);
}
正如您在FindActiveByStore
中看到的,我首先调用FindActive
,然后将Find()
链接起来。 FindActive之后是Where()
以添加辅助谓词(借用术语)。
我想知道是否可以将谓词传递给FindActive
而不是使用Where()
,事实上它是否会在性能方面产生影响。
像这样:
FindActive(d => d.StoreId == storeId)
FindActive已经将谓词传递给Find()
,因此它需要将两者结合起来。
我猜我得到的答案在努力或表现方面都是“不值得的”,但我认为无论如何我都会问专家。
答案 0 :(得分:0)
您可以使用此代码(减少代码行数)
public IQueryable<Deal> FindActiveByStore(Expression<Func<Deal,bool>> predicate)
{
var r = new ReadRepo<Deal>(Local.Items.Uow.Context);
return r.Find(d => d.ActiveFrom <= DateTime.Now
&& (d.ActiveUntilComputed == null || d.ActiveUntilComputed > DateTime.Now)
&& d.Published)
.Where(predicate);
}