使用动态Linq查询子字符串时出错

时间:2016-08-24 22:50:58

标签: c# sql entity-framework linq dynamic-linq

我正在尝试使用动态linq从使用Entity的数据库中获取人员子集 框架(EF)。我在使用contains操作时遇到了问题。这是实体 为人民表:

public class Person
{
    public string Id { get; set; }
    public string Name { get; set; }
    public string Address { get; set; }
    public string City { get; set; }
    public string State { get; set; }
    public string ZipCode { get; set; }
}

这是一个成功运作的查询。

var people = personContext
    .People
    .OrderBy("id asc")
    .Skip(0)
    .Take(5)
    .ToList();

请注意,我在OrderBy方法中使用动态linq。但是,当我尝试申请时 过滤,我得到一个例外。

var people = personContext
    .People
    .Where("id.Contains(15)")
    .OrderBy("id asc")
    .Skip(0)
    .Take(5)
    .ToList();

我想要回来的是包含子字符串“15”的ID的一部分,例如:

"015", "115", "151", "152", etc.

当我执行代码时,出现以下错误。

System.Linq.Dynamic.ParseException was unhandled by user code
    Message=No applicable method 'Contains' exists in type 'String'

确定Id字段是否包含字符串“15”的语法是什么?

3 个答案:

答案 0 :(得分:2)

我觉得这里有误解......你不应该像这样使用LINQ。 首先,您需要调用接受lambdas的重载;然后在lambda中指定属性,如果是一个字符串,则在其上调用Contains。像这样:

var people = personContext
    .People
    .Where(p => p.Id.Contains("15"))
    .OrderByDescending(p => p.Id)
    .Skip(0) // You don't need this line.
    .Take(5)
    .ToList();

EF本身将完成繁重工作并将这些纯C#代码转换为正确的SQL语句。

答案 1 :(得分:2)

  

确定Id字段是否包含字符串" 15"

的语法是什么

嗯,绝对不是.Where("id.Contains(15)")尝试使用数字值15来调用方法Contains

根据documentation,您可以使用字符串文字

.Where("id.Contains(\"15\")")

substitution values

.Where("id.Contains(@0)", "15")

答案 2 :(得分:0)

您无法在LINQ查询中使用包含。相反,你可以尝试这个

var people = (from p in personContext.Set<People>() 
    where p.Id.Contains("15")
    orderby p.Id
    select p).Skip(0).Take(5).ToList();