根据动态条件过滤EF LINQ

时间:2015-03-12 11:19:21

标签: c# entity-framework

  • 使用Entity Framework 6,具有域模型的存储库模式
  • 我想根据用户是否选择了货币(通过FK链接到产品)来过滤产品(模型)
  • 过滤器将应用于货币
  • 的单独对象(表格)
  • 我正在考虑创建一个IQueryable扩展方法,但因为它是一个自定义类型,并且由于FK而只在Product对象中,所以我认为这不会起作用

我更喜欢避免(因为我有很多查询产品的方法)

   public bool DoesUniqueHaveChildProducts(string productName, int brandId)
    {
        if (UserCurrency.userCurrency == -1)
        {
            //don't filter
            return _db.Products.Any(x => x.BrandID == brandId && x.Name.Contains(productName));
        }

        return _db.Products.Any(x => x.BrandID == brandId && x.Name.Contains(productName) && x.MasterSite.CurrencyID == UserCurrency.userCurrency);
    }

寻找想法&建议

谢谢!

2 个答案:

答案 0 :(得分:1)

这应该适合你:

Func<Product, bool> predicate = x => x.BrandID == brandId && x.Name.Contains(productName);

if (UserCurrency.userCurrency != -1)
{
    predicate = x => x.BrandID == brandId && 
                     x.Name.Contains(productName) && 
                     x.MasterSite.CurrencyID == UserCurrency.userCurrency;
}

return _db.Products.Any(predicate);

答案 1 :(得分:1)

在每种情况下,Queryable<TModel>.Any都会使用Expression<Func<TModel, bool>>类型的参数。

所以你可以把条件放在本地:

Expression<Func<TModel, bool>> pred;
if (whatever) {
  pred = m => Condition(m)
} else {
  pred = m => OtherCondition(m)
}

return db.Products.Any(pred);

可能更干净(取决于情况)。

也可以动态地构建Expression<whatever>,但是可以使用System.Linq.Expressions中的类型来反映大量代码......