【问题标题】:LINQ to Entity, using a SQL LIKE operatorLINQ to Entity,使用 SQL LIKE 运算符
【发布时间】:2010-03-22 15:58:09
【问题描述】:

我有一个从表中提取的 LINQ to ENTITY 查询,但我需要能够创建一个“模糊”类型的搜索。所以我需要添加一个 where 子句,如果他们在搜索框中添加条件(文本框,可以是空白 --- 在这种情况下它会拉出所有内容),则按姓氏搜索。

这是我目前所拥有的:

    var query = from mem in context.Member
                orderby mem.LastName, mem.FirstName
                select new
                {
                    FirstName = mem.FirstName,
                    LastName = mem.LastName,

                };

这将从 Entity 对象中的 Member 表中提取所有内容。

那我还有一个逻辑补充:

sLastName = formCollection["FuzzyLastName"].ToString();

if (!String.IsNullOrEmpty(sLastName))
   query = query.Where(ln => ln.LastName.Contains(sLastName));

问题是当按下搜索按钮时,没有返回任何内容(0 个结果)。我已经针对我希望在这里发生的 SQL Server 运行查询,它返回 6 个结果。

这是我期望的查询:

SELECT mem.LastName, mem.FirstName FROM Members mem WHERE mem.LastName LIKE '%xxx%'

(当xxx输入到文本框时)

有人觉得这有什么问题吗?

编辑:修复了 SELECT 查询。我的意思是让它读为 LIKE '%xxx%' (NOT = 'xxx")

【问题讨论】:

  • 你想要的是 peraps '%xxx%'?
  • 是的,百分号是通配符,Like 原因应该是:mem.LastName LIKE '%xxx%'。
  • 我还将确保搜索值实际上被正确传递的值。调试它并使用断点检查搜索字符串。
  • 在这里发布整个方法可能会对您有所帮助,这样我们就可以看到您还在做什么。

标签: asp.net-mvc entity-framework linq-to-entities


【解决方案1】:

我想你想像这样使用字符串参数的Contains()函数:

var query = from mem in context.Member
    where mem.LastName.Contains("xxx")
    orderby mem.LastName, mem.FirstName
    select new
    {
        FirstName = mem.FirstName,
        LastName = mem.LastName,
    };

我认为您也可以使用 StartsWith()EndsWith(),它们分别相当于 SQL 'xxx%' 和 '%xxx"。

【讨论】:

  • 但是当它是空白的时候呢?如果 .Contains() 存在并且该字段为空,将不会返回任何内容?我在之后添加 .Where 子句的原因是在没有输入任何内容的情况下(所以我不必对两者都有单独的查询)
  • 您可以将所有这些作为一个查询来完成,只需在运行查询之前确保字符串不为空。我认为如果字符串为空,您将获得所有记录。
  • 我在一个空字符串上测试了所有记录的理论,得到0个结果。如果那是解决方案,我会很高兴,但是,唉,这个问题仍然没有解决方案......
  • 如何使用contains使其不敏感?
  • 对于其他阅读本文的人,我可以确认 StartsWith 和 EndsWith 确实被翻译成 SQL。 stackoverflow.com/a/990499/1517929
【解决方案2】:

仅在附加“Where”子句后才将“select new”添加到查询中。

因此,使用对象调用语法附加您的 select 子句,就像使用 where 子句一样。

未经测试,请原谅小错误,但一般概念是......

   using( someContent sc = new someContent())
   {
      var query = sc.Member.OrderBy( i => i.LastName)
                    .ThenBy( i => i.FirstName);

      sLastName = formCollection["FuzzyLastName"].ToString();

      if (!String.IsNullOrEmpty(sLastName))
          query = query.Where(ln => ln.LastName.Contains(sLastName));

      query = query.Select( i => new
                {
                    FirstName = i.FirstName,
                    LastName = i.LastName,

                });
    }

【讨论】:

    【解决方案3】:
    SELECT mem.LastName, mem.FirstName FROM Members mem WHERE mem.LastName = 'xxx'
    

    这意味着您希望姓氏等于“xxx”。您在上面的帖子中写的是姓氏应该包含“xxx”。

    要让它相等,你应该写:

    if (!String.IsNullOrEmpty(sLastName))
       query = query.Where(ln => ln.LastName == sLastName);
    

    也许你应该看看忽略大小写:

    if (!String.IsNullOrEmpty(sLastName))
       query = query.Where(ln => ln.LastName.Equals(sLastName, StringComparison.InvariantCultureIgnoreCase));
    

    【讨论】:

    • 对不起,我修复了帖子,感谢您指出这一点。我的 == 查询工作得很好,用户只需要一种方法来对名称进行“模糊”搜索。
    猜你喜欢
    • 1970-01-01
    • 2011-04-28
    • 2011-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多