Asp.net mvc LINQ到实体,使用类似SQL的运算符
我有一个从表中提取的LINQ到实体的查询,但我需要能够创建一个“模糊”类型的搜索。因此,我需要添加一个where子句,如果他们在搜索框中添加了条件(文本框,可以为空——在这种情况下,它会提取所有内容),那么它将按lastname进行搜索 以下是我到目前为止的情况: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
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%”。我还需要确保搜索值实际传递的值正确。调试它并用断点检查搜索字符串。在这里发布整个方法可能会有帮助,这样我们就可以看到您还做了什么。