1

我正在使用Dynamic LinqwithLinq 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使用 base 字符串?任何人都可以帮助我吗?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.cs动态 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 });
    }
    

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

编辑

选项 1 不起作用,因为在示例中Concat获取了四个以上 的字符串参数。它最多只能使用四个参数,因为string.Concat具有四个显式string参数的重载。似乎不可能params string[]在动态 LINQ 中将重载与数组参数一起使用。

于 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 回答