Asp.net mvc LINQ到实体,使用类似SQL的运算符

Asp.net mvc LINQ到实体,使用类似SQL的运算符,asp.net-mvc,entity-framework,linq-to-entities,Asp.net Mvc,Entity Framework,Linq To Entities,我有一个从表中提取的LINQ到实体的查询,但我需要能够创建一个“模糊”类型的搜索。因此,我需要添加一个where子句,如果他们在搜索框中添加了条件(文本框,可以为空——在这种情况下,它会提取所有内容),那么它将按lastname进行搜索 以下是我到目前为止的情况: var query = from mem in context.Member orderby mem.LastName, mem.FirstName select

我有一个从表中提取的LINQ到实体的查询,但我需要能够创建一个“模糊”类型的搜索。因此,我需要添加一个where子句,如果他们在搜索框中添加了条件(文本框,可以为空——在这种情况下,它会提取所有内容),那么它将按lastname进行搜索

以下是我到目前为止的情况:

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

                };
这将从实体对象中的成员表中提取所有内容

然后,我在逻辑上增加了一项:

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时)

有人看到这有什么问题吗


编辑:修复了选择查询。我的意思是让它读起来像“%xxx%”(而不是像“xxx”)

我想您应该像这样使用string参数的
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”

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));
只有在附加“Where”子句之后,才能将“selectnew”添加到查询中

因此,使用对象调用语法附加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,

                });
    }

但是当它是空白的时候呢?如果.Contains()存在且字段为空,则将不返回任何内容?。我在后面添加.Where子句的原因是在没有输入任何内容的情况下(因此我不必对两者都使用单独的查询),您可以将所有操作作为一个查询来完成,只需在运行查询之前确保字符串不为空即可。我认为如果字符串为空,您将获得所有记录。我测试了空字符串上所有记录的理论,结果为0。如果这是解决方案,我会很高兴,但是,唉,这个问题仍然没有解决方案……如何使用
contains
使其不敏感?对于其他来阅读本文的人,我可以确认StartsWith和EndsWith确实被翻译成SQL。对不起,我修好了帖子,谢谢你指出这一点。我的==查询工作正常,用户只需要一种对名称进行“模糊”搜索的方法。您需要的是PERAP“%xxx%”?是的,百分号是一个通配符,类似的原因应该是:mem.LastName类似“%xxx%”。我还需要确保搜索值实际传递的值正确。调试它并用断点检查搜索字符串。在这里发布整个方法可能会有帮助,这样我们就可以看到您还做了什么。