gpt4 book ai didi

c# - 使用 linq 将字符串连接到实体

转载 作者:太空宇宙 更新时间:2023-11-03 20:18:19 25 4
gpt4 key购买 nike

我正在使用 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 does not recognize the method 'System.String Concat(System.Object, System.Object)' method, and this method cannot be translated into a store expression.

我的问题是:

如何 Concat使用 Linq To Entities 的字符串在我的示例中使用 Dynamic Linq 吗?任何人都可以帮助我吗?

最佳答案

  • 选项 1:

    改变线路...

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

    ...到

    fields.Add("or string.Concat(LastName, \", \", MiddleName, \" \", FirstName).Contains(@1)");
  • 选项 2:

    打开动态 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 });
    }

请记住,Dynamic LINQ 不是特殊的“LINQ-to-Entities 库”,而是IQueryable 的通用库。可能有支持 string.Concat(object, object) 和一般 object 参数的可查询提供程序,但 LINQ-to-Entities 不支持。它只支持 string.Concatstring 参数版本。在实际调用 GenerateStringConcat 时查看动态 LINQ 文件(仅一次)我相信只要您只想将库与 LINQ-to-Entities/Entity Framework 一起使用,上述更改是安全的。

编辑

选项 1 不起作用,因为 Concat 在示例中获取了超过 四个 个字符串参数。它最多只能使用四个参数,因为 string.Concat 有一个带有四个显式 string 参数的重载。在 Dynamic LINQ 中似乎无法使用数组参数 params string[] 的重载。

关于c# - 使用 linq 将字符串连接到实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15277533/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com