[英]Concat the string with linq to entities
我正在使用带有Linq to Entities
的Dynamic Linq
因此,我使用此代码测试了普通的List<Person>
,一切正常:
List<Person> per = new List<Person>();
per.Add(new Person { IdNo = "1", LastName = "test", MiddleName = "go", FirstName = "let" });
per.Add(new Person { IdNo = "2", LastName = "hope", MiddleName = "is", FirstName = "way" });
per.Add(new Person { IdNo = "3", LastName = "must", MiddleName = "be", FirstName = "human" });
per.Add(new Person { IdNo = "4", LastName = "thing", MiddleName = "anywhere", FirstName = "can" });
per.Add(new Person { IdNo = "5", LastName = "bird", MiddleName = "fly", FirstName = "away" });
List<object> paramObjects = new List<object>();
List<string> fields = new List<string>();
fields.Add("IdNo == @0");
paramObjects.Add("1");
fields.Add("or (LastName + \", \" + MiddleName + \" \" + FirstName).Contains(@1)");
paramObjects.Add("m");
var where = string.Join(" ", fields.ToArray());
var toParam = paramObjects.ToArray();
var query = per.AsQueryable().Where(where, toParam).ToList();
当我进入Linq To Entities
方法时。
using(var con = new DbContext())
{
var query = con.Person.Where(where, toParam).ToList();
}
我收到此错误:
LINQ to Entities无法识别方法'System.String Concat(System.Object,System.Object)',并且该方法无法转换为商店表达式。
我的问题是:
如何Concat
使用字符串Linq To Entities
基地,在使用动态的LINQ我的例子吗? 有人可以帮助我吗?
选项1:
换线...
fields.Add("or (LastName + \\", \\" + MiddleName + \\" \\" + FirstName).Contains(@1)");
...至
fields.Add("or string.Concat(LastName, \\", \\", MiddleName, \\" \\", FirstName).Contains(@1)");
选项2:
打开Dynamic LINQ库的Dynamic.cs
文件,在该文件中搜索"GenerateStringConcat"
。 您应该找到此方法:
Expression GenerateStringConcat(Expression left, Expression right) { return Expression.Call( null, typeof(string).GetMethod("Concat", new[] { typeof(object), typeof(object) }), new[] { left, right }); }
将object
参数类型更改为string
,即:
Expression GenerateStringConcat(Expression left, Expression right) { return Expression.Call( null, typeof(string).GetMethod("Concat", new[] { typeof(string), typeof(string) }), new[] { left, right }); }
请记住,动态LINQ不是特殊的“ LINQ-to-Entities库”,而是IQueryable
的常规库。 可能有可查询的提供程序支持带有通用object
参数的string.Concat(object, object)
,但LINQ-to-Entities不支持。 它仅支持string.Concat
的string
参数版本。 在实际调用GenerateStringConcat
时(仅一次)浏览动态LINQ文件,我相信上述更改是安全的,只要您只想将库与LINQ-to-Entities / Entity Framework一起使用即可。
编辑
选项1不起作用,因为在示例中Concat
获得了四个以上的字符串参数。 它最多只能使用四个参数,因为string.Concat
具有四个显式string
参数的重载。 在Dynamic LINQ中似乎无法将重载与数组参数params string[]
一起使用。
我有同样的问题,但是使用NHibernate,我的解决方案是修改GenerateStringConcat方法
我改变这个:
static Expression GenerateStringConcat(Expression left, Expression right)
{
return Expression.Call(
null,
typeof(string).GetMethod("Concat", new[] { typeof(object), typeof(object) }),
new[] { left, right });
}
为了这:
static Expression GenerateStringConcat(Expression left, Expression right)
{
return Expression.Add(
left,
right,
typeof(string).GetMethod("Concat", new[] { typeof(object), typeof(object) })
);
}
他工作得很好:)
更改
var where = string.Join(" ", fields.ToArray());
至
string where = string.Empty;
foreach(var f in fields)
{
where += f + " ";
}
where = where.Trim();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.