【发布时间】:2015-02-14 19:40:38
【问题描述】:
让我先解释一下我要完成的工作。
我正在使用实体框架与 SQL Server 数据库进行通信的 C# ASP.NET MVC 5 项目。大多数查询使用 linq 进行查询。在前端站点的各个地方,我正在显示记录列表,并且需要提供通过搜索栏搜索这些记录的方法。现在最初的想法是允许用户输入一个搜索词组,其中关键字用空格分隔,这些关键字用于匹配表记录中的任何字段组合。
例如,假设我的搜索是针对用户表的“John Doe”。考虑这些是该表中的记录:
uFirstName uLastName
---------- ----------
Johnny Doe
John Doe
Jane Doe
应该返回前两条记录。
这是一个示例方法,我会调用它来返回我期望的结果:
public static List<UserModel> GetUserList(string terms)
{
using (DBConnection dbcontext = new DBConnection())
{
var termlist = (terms == "") ? new List<string>() : terms.Split(' ').ToList();
var linqList = (from u in dbcontext.Users
where
(
(terms == "") ||
(termlist.Any(_s => u.uLastName.Contains(_s))) ||
(termlist.Any(_s => u.uFirstName.Contains(_s)))
)
select new { u.uLastName, u.uFirstName });
return linqList.ToList().ConvertAll<UserModel> ( u => new UserModel { LastName = u.uLastName, FirstName = u.uFirstName } );
}
}
在我的项目中,我在不同的地方使用这个搜索栏来搜索显然具有不同字段的各种表格。我想做的是创建一个辅助方法,它允许我传入“terms”字符串,并使其与 linq 语句中的字段值列表相匹配。这是一个示例伪方法,显示了我想将上述方法更改为:
public static List<UserModel> GetUserList(string terms)
{
using (DBConnection dbcontext = new DBConnection())
{
var linqList = (from u in dbcontext.Users
where SearchTermMatch(terms, new List<string>() { u.uLastName, u.uFirstName }) == true
select new { u.uLastName, u.uFirstName });
return linqList.ToList().ConvertAll<UserModel>(u => new UserModel { LastName = u.uLastName, FirstName = u.uFirstName });
}
}
这就是辅助方法的样子:
public static bool SearchTermMatch(string terms, List<string> fieldvalues)
{
if (terms == "") return true;
else
{
var termlist = terms.Split(' ').ToList();
var foundlist = new List<bool>();
foreach (string value in fieldvalues)
foundlist.Add(termlist.Any(s => value.Contains(s)));
return foundlist.Any(f => f == true);
}
}
即使编译正常,但在运行时会产生以下错误:
LINQ to Entities 无法识别方法 'Boolean SearchTermMatch(System.String, System.Collections.Generic.List`1[System.String])' 方法,并且此方法无法转换为存储表达式。
从我对如何使其工作的所有搜索中,很明显我需要使用表达式,但我一生都无法理解它们是如何工作的。我所理解的是,Entity Framework 想要将 linq 语句转换为 SQL 可以理解的查询,而我的辅助方法不具备这样做的能力。
我最终想要完成的是构建一个辅助方法,以后可以使用更高级的搜索技术对其进行扩展。我想如果我从基于关键字拆分对所有相关字段的搜索开始简单,我以后可以添加更多的复杂性,我只需要对这个辅助方法进行操作,我的所有搜索栏都将从这些改进中受益。
所以我想我正在寻找的是你对我如何创建这个帮助方法的帮助,我可以在我的项目中的各种 linq 语句中使用它。
【问题讨论】:
标签: c# sql-server asp.net-mvc linq entity-framework-6