我想接受来自客户端的 where 条件字符串数组,例如 field == value
。
如果能创建一个可以在构造函数中接受字符串并输出一个 lambda 表达式来表示 Where 子句的规范对象,那就太好了。例如,我可以执行以下操作:
var myCondition = new Specification<Product>( myStringArrayOfConditions);
var myProducts = DB.Products.Where( myCondition);
如何将 "name == Jujyfruits"
变成 DB.Products.Where(p => p.name == "JujyFruits")
?
最佳答案
你可以使用
- 反射(reflection)获得属性(property)
Product.name
来自字符串name
和 - LINQ
Expression
手动创建 lambda 表达式的类。
请注意,以下代码示例仅适用于 Equals (==)
操作。但是,也很容易推广到其他操作(按空格拆分,解析运算符并选择适当的表达式而不是 Expression.Equal
)。
var condition = "name == Jujyfruits";
// Parse the condition
var c = condition.Split(new string[] { "==" }, StringSplitOptions.None);
var propertyName = c[0].Trim();
var value = c[1].Trim();
// Create the lambda
var arg = Expression.Parameter(typeof(Product), "p");
var property = typeof(Product).GetProperty(propertyName);
var comparison = Expression.Equal(
Expression.MakeMemberAccess(arg, property),
Expression.Constant(value));
var lambda = Expression.Lambda<Func<Product, bool>>(comparison, arg).Compile();
// Test
var prod1 = new Product() { name = "Test" };
var prod2 = new Product() { name = "Jujyfruits" };
Console.WriteLine(lambda(prod1)); // outputs False
Console.WriteLine(lambda(prod2)); // outputs True
关于构造函数:自 Func<T, TResult>
是密封的,你不能从中得到。但是,您可以创建一个 implicit conversion operator翻译Specification<T>
进入Func<T, bool>
.
关于c# - Entity Framework 4 : convert a string condition to a lambda expression?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5853568/