1

私はとを使用してDynamic LinqいますLinq to Entities

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)'メソッドを認識せず、このメソッドをストア式に変換できません。

私の質問は:

Dynamic Linqを使用した私の例では、ベースをConcat使用して文字列を作成するにはどうすればよいですか?誰でも私を助けることができますか?Linq To Entities

4

3 に答える 3

4
  • オプション1:

    行を変更します...

    fields.Add("or (LastName + \", \" + MiddleName + \" \" + FirstName).Contains(@1)");
    

    ...に

    fields.Add("or string.Concat(LastName, \", \", MiddleName, \" \", FirstName).Contains(@1)");
    
  • オプション2:

    Dynamic.csDynamic LINQライブラリのファイルを開き、そのファイルで検索"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 });
    }
    

Dynamic LINQは、特別な「LINQ-to-Entitiesライブラリ」ではなく、の一般的なライブラリであることに注意してIQueryableください。string.Concat(object, object)一般パラメータでサポートするクエリ可能なプロバイダーがあるかもしれませんがobject、LINQ-to-Entitiesはサポートしていません。stringのパラメータバージョンのみをサポートしますstring.Concat。が実際に呼び出されたときに動的LINQファイルを確認するGenerateStringConcatと(1回のみ)、LINQ-to-Entities / Entity Frameworkでライブラリを使用するだけであれば、上記の変更は安全だと思います。

編集

例では4つConcatを超える 文字列パラメーターを取得するため、オプション1は機能しません。4つの明示的なパラメーターによるオーバーロードがあるため、最大4つのパラメーターしか機能しません。DynamicLINQの配列パラメーターでオーバーロードを使用することはできないようです。string.Concatstringparams string[]

于 2013-03-07T17:58:45.597 に答える
1

私は同じ問題を抱えていましたが、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) })
        );
    }

彼はかなりうまく働いています:)

于 2015-07-02T20:57:26.150 に答える
0

変化する

 var where = string.Join(" ", fields.ToArray());

string where = string.Empty;
foreach(var f in fields)
{
    where += f + " "; 
}

where = where.Trim();
于 2013-03-07T17:25:27.473 に答える