Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实体框架4:将字符串条件转换为lambda表达式?_C#_C# 4.0_Entity Framework 4 - Fatal编程技术网

C# 实体框架4:将字符串条件转换为lambda表达式?

C# 实体框架4:将字符串条件转换为lambda表达式?,c#,c#-4.0,entity-framework-4,C#,C# 4.0,Entity Framework 4,我想从客户端接受where条件的字符串数组,如field==value。 创建一个规范对象,该对象可以接受构造函数中的字符串,并输出一个lambda表达式来表示Where子句,这将非常好。例如,我可以执行以下操作: var myCondition = new Specification<Product>( myStringArrayOfConditions); var myProducts = DB.Products.Where( myCondition); string sea

我想从客户端接受where条件的字符串数组,如
field==value
。 创建一个规范对象,该对象可以接受构造函数中的字符串,并输出一个lambda表达式来表示Where子句,这将非常好。例如,我可以执行以下操作:

var myCondition = new Specification<Product>( myStringArrayOfConditions); 
var myProducts = DB.Products.Where( myCondition);
string searchString = "JujyFruits";
Func<Product, bool> search = new Func<Product,bool>(p => p.name == searchString);

return DB.Products.Where(search);
var myCondition=新规范(mystringarayofconditions);
var myProducts=DB.Products.Where(myCondition);

如何将
“name==Jujyfruits”
转换为
DB.Products.Where(p=>p.name==“Jujyfruits”)

您需要将搜索词转换为谓词。请尝试以下操作:

var myCondition = new Specification<Product>( myStringArrayOfConditions); 
var myProducts = DB.Products.Where( myCondition);
string searchString = "JujyFruits";
Func<Product, bool> search = new Func<Product,bool>(p => p.name == searchString);

return DB.Products.Where(search);
string searchString=“JujyFruits”;
Func search=newfunc(p=>p.name==searchString);
返回DB.Products.Where(搜索);
您可以使用

  • 反射以从字符串
    name
    获取属性
    Product.name
    ,并
  • LINQ
    Expression
    类手动创建lambda表达式
请注意,以下代码示例仅适用于
等于(=)
操作。但是,它也很容易推广到其他操作(按空格拆分,解析运算符并选择适当的表达式,而不是
Expression.Equal

var condition=“name==Jujyfruits”;
//解析条件
var c=condition.Split(新字符串[]{“=”},StringSplitOptions.None);
var propertyName=c[0].Trim();
var value=c[1]。Trim();
//创建lambda
var arg=表达式参数(产品类型),“p”);
var property=typeof(Product).GetProperty(propertyName);
变量比较=表达式。相等(
表达式.MakeMemberAccess(参数,属性),
表达式。常量(值));
var lambda=Expression.lambda(比较,arg.Compile();
//试验
var prod1=新产品(){name=“Test”};
var prod2=新产品(){name=“Jujyfruits”};
Console.WriteLine(lambda(prod1));//输出错误
Console.WriteLine(lambda(prod2));//输出为真

关于构造函数的事情:因为
Func
是密封的,所以不能从中派生。但是,您可以创建一个将
规范
转换为
Func

的程序,我们最近从VS2008示例项目中发现了动态LINQ库。非常适合将基于字符串的“Where”子句转换为表达式


有没有办法绕过big switch语句来测试产品的每个属性的名称?你能得到产品的“原始”属性列表,测试字段幻码串,并构造一个lambda表达式,其中p.name被表示为幻码串吗?嗯,我不确定这是否微不足道。请看这个问题:与您的答案非常相似,它强调了您的方法可能是使规范成为一等公民的普遍接受的方法。为什么您不能将lambda传递到方法中,而不是传递字符串。您传入的Where(“name==Jujyfruits”)。Where(x=>x.name==“Jujyfruits”)?我真的不知道你想做什么。如果“规范”(where子句)来自客户端,它将以字符串的形式出现。我需要把它转换成EF能理解的东西,这通常是lambda表达式。所以你可以做一些类似于产品的事情。在哪里(p= > lambda(p))?Zim:博士,实际上,<代码>产品。(lambda)应该是足够的。如果你要走这条路线,考虑缓存委托(var lambda)。编译表达式树会对性能造成合理的影响,在每次搜索查询之前,您肯定不想这样做。@AnteSim:这取决于您如何定义“合理”。在我的机器上,编译上面示例中的lambda大约需要5毫秒。我猜搜索中的数据库查询部分需要花费更长的时间…@Heinzi:当他根据多个属性修改代码来过滤搜索时会发生什么?单独来看,您的代码很好。但您只需要知道,如果需要,这是一个优化点。它肯定在where子句中使用字符串。这是个好答案。但是,它会在更改数据类型时产生副作用。