动态构建WhereClause,LinqToSql我第一次使用EFCode4.2,当需要动态构建where子句时,你有什么解决方案??不过包含函数是非常有必要的:varresults=db.Set.Where("dynamicconditions").Include("......");上面的动态条件需要再找一张表来过滤记录:如果我想在Linq表达式中写,那就是这样的:varresult=db.Set().Where(c=>c.AccountId==_Id_param||db.Set().Any(a=>a.FkFieldId==c.AccountId&&a.ParentId==_Id_param)).Include("引号");我基本上需要一个用于上述表达式的动态linq,因为对于不同类型的Where子句字段更改(Contact只是一个示例),例如在一个模型中,FK字段可能是“AccountId”,而在另一个模型中,它需要是“AccountFKId”。所以Where子句必须是动态的!IQueryable是可组合的,因此您可以动态构建查询:varquery=db.Set().Include(...);如果(某事){query=query.Where(...);}//其他地方Linq是强类型的,因此您始终必须至少知道您的什么类型将开始在Set调用中使用。您可以使其通用但不是动态的(除非您打算通过反射将其作为一个整体写出来)。您可以使用动态linq来定义带有字符串的条件,但同样您至少必须知道Set类型。更新我能够通过直接修改表达式树来解决问题。使用TomasP博客中的想法有很大帮助:关键是为内部查询创建第二个IQueryable,然后将其作为表达式传递给现有的动态模型一个IQueryable表达式。IQueryablelinkQuery=db.Set().AsQueryable();MethodCallExpressioninternalQueryWhere=Expression.Call(typeof(Queryable),"Where",newType[]{linkQuery.ElementType},linkQuery.Expression,Expression.Lambda>(myfilters,newParameterExpression[]{filterParameter}));linkQuery=linkQuery.Provider.CreateQuery(internalQueryWhere);表达式anyMethodExpr=Expression.Call(typeof(Queryable),"Any",newType[]{linkQuery.ElementType},linkQuery.Expression);现在您可以将anyMethodExpr传递给原始实体的IQueryablewhere子句。以上就是C#学习教程:构建动态where子句,LinqToSql分享的全部内容,如果对您有用,还需要进一步了解C#学习教程,希望大家多多关注.本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
