linq谓词可以合并在这里吗?

时间:2012-09-07 07:42:01

标签: linq entity-framework

我正在使用带有工作单元+存储库模式的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(),因此它需要将两者结合起来。

我猜我得到的答案在努力或表现方面都是“不值得的”,但我认为无论如何我都会问专家。

1 个答案:

答案 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);   
}