我有一个从表中提取的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“)
答案 0 :(得分:15)
我想你想使用字符串参数的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'。
答案 1 :(得分:3)
仅在追加“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,
});
}
答案 2 :(得分:1)
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));