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)'メソッドを認識しないため、このメソッドをストア式に変換できません。
私の質問は:
動的Linqを使用する私の例でLinq To Entities
ベースLinq To Entities
使用して文字列をConcat
する方法は?誰でも手伝ってくれる?
オプション1:
行を変更...
fields.Add("or (LastName + \", \" + MiddleName + \" \" + FirstName).Contains(@1)");
...に
fields.Add("or string.Concat(LastName, \", \", MiddleName, \" \", FirstName).Contains(@1)");
オプション2:
Dynamic LINQライブラリのDynamic.cs
ファイルを開き、 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
に変更しobject
。
Expression GenerateStringConcat(Expression left, Expression right) {
return Expression.Call(
null,
typeof(string).GetMethod("Concat",
new[] { typeof(string), typeof(string) }),
new[] { left, right });
}
Dynamic LINQは特別な「LINQ-to-Entitiesライブラリ」ではなく、 IQueryable
一般的なライブラリであることにIQueryable
。一般的なobject
パラメーターでstring.Concat(object, object)
をサポートするstring.Concat(object, object)
可能なプロバイダーがあるかもしれませんが、LINQ-to-Entitiesはそうではありません。 string.Concat
string
パラメーターバージョンのみをサポートしstring
。 GenerateStringConcat
が実際に呼び出されたときに(一度だけ)動的LINQファイルを確認するLINQ-to-Entities / Entity Frameworkでライブラリを使用するだけであれば、上記の変更は安全だと思います。
編集する
例ではConcat
が4つを超える文字列パラメーターを取得するため、オプション1は機能しません。 string.Concat
は4つの明示的なstring
パラメーターを持つオーバーロードがあるため、最大4つのパラメーターしか機能しません。動的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) })
);
}
彼はかなりうまくいった:)