C# 基于动态条件的EF-LINQ滤波 使用实体框架6,存储库模式和域模型 我想根据用户是否选择了货币(通过FK链接到产品中)来过滤产品(模型) 过滤器将应用于货币的单独对象(表) 我曾考虑创建一个IQueryable扩展方法,但由于它是一个自定义类型,并且由于FK,仅在产品对象中使用,因此我认为这是行不通的

C# 基于动态条件的EF-LINQ滤波 使用实体框架6,存储库模式和域模型 我想根据用户是否选择了货币(通过FK链接到产品中)来过滤产品(模型) 过滤器将应用于货币的单独对象(表) 我曾考虑创建一个IQueryable扩展方法,但由于它是一个自定义类型,并且由于FK,仅在产品对象中使用,因此我认为这是行不通的,c#,entity-framework,C#,Entity Framework,我希望避免的内容(因为我有很多查询产品的方法) 寻找想法和建议 谢谢 这应该适合您: Func<Product, bool> predicate = x => x.BrandID == brandId && x.Name.Contains(productName); if (UserCurrency.userCurrency != -1) { predicate = x => x.BrandID == brandId &&

我希望避免的内容(因为我有很多查询产品的方法)

寻找想法和建议


谢谢

这应该适合您:

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);
Func predicate=x=>x.BrandID==BrandID&&x.Name.Contains(productName);
如果(UserCurrency.UserCurrency!=-1)
{
谓词=x=>x.BrandID==BrandID&&
x、 名称。包含(productName)和
x、 MasterSite.CurrencyID==UserCurrency.UserCurrency;
}
返回_db.Products.Any(谓词);

在每种情况下
都是可查询的。任何
都采用
表达式类型的参数

所以你可以把这个条件放在一个地方:

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

return db.Products.Any(pred);
expressionpred;
如果(无论什么){
pred=m=>条件(m)
}否则{
pred=m=>OtherCondition(m)
}
返回db.Products.Any(pred);
哪种可能更干净(取决于具体情况)


也可以动态地构建一个
表达式
,但就像反射一样,它可以是大量的代码。。。使用
System.Linq.Expressions
return\u db.Products.Any(x=>x.BrandID==BrandID&&x.Name.Contains(productName)&&&(x.MasterSite.CurrencyID==UserCurrency.UserCurrency==UserCurrency.UserCurrency==-1)
喜欢简单,我从来没有想到过,保罗欢呼道
Expression<Func<TModel, bool>> pred;
if (whatever) {
  pred = m => Condition(m)
} else {
  pred = m => OtherCondition(m)
}

return db.Products.Any(pred);