[英]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.