簡體   English   中英

用linq將字符串連接到實體

[英]Concat the string with linq to entities

我正在使用帶有Linq to EntitiesDynamic 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.Concatstring參數版本。 在實際調用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM