我正在尝试使用 LINQ 查询在项目上实现搜索功能。由于数据有时包含带有重音符号和其他符号的字符,因此我创建了一种方法来删除这些字符以进行搜索。
这是我的代码:
var addresses = (from a in db.Addresses
join b in db.Addresses on a.ClientID equals b.ClientID
where a.AddressType == 1 && b.AddressType == 2
select new
{
/* Columns selected */
});
var q = (from e in db.Employers
join a in addresses on e.EmployerID equals a.id
join i in db.IndustrialSectors on e.IndustrialSector equals i.ID
select new
{
/* Columns selected */
});
if (search != "")
{
q = (from i in q
where (
Util.StringUtil.RemoveDiacritics(i.entity.ToString().ToLowerInvariant()).Contains(search) ||
Util.StringUtil.RemoveDiacritics(i.name.ToString().ToLowerInvariant()).Contains(search)
)
select i);
}
它生成一个异常,指出 LINQ to Entities 无法识别我的方法 (RemoveDiacritics(String))。
当您使用 LINQ-to-Entities 时,您的 LINQ 查询需要转换为“服务器端表达式”,这在英语中意味着数据库可以执行的东西。数据库不知道有关您调用的 C# 方法的任何信息RemoveDiacritics
所以你在运行时会得到一个错误。
您需要先执行查询,然后使用 LINQ-to-Objects 进行过滤。只需添加一个即可完成ToList()
在过滤查询之前。我对流畅的语法更熟悉一些,所以我将其写为:
q.ToList().Where(i =>
Util.StringUtil.RemoveDiacritics(i.entity.ToString().ToLowerInvariant()).Contains(search) ||
Util.StringUtil.RemoveDiacritics(i.name.ToString().ToLowerInvariant()).Contains(search));
如果你想要查询语法,你就必须搞乱它。可能类似于以下内容,但我不能 100% 确定。
(from i in q.ToList()
where Util.StringUtil.RemoveDiacritics(i.entity.ToString().ToLowerInvariant()).Contains(search) ||
Util.StringUtil.RemoveDiacritics(i.name.ToString().ToLowerInvariant()).Contains(search));
但请注意,这将带回一切从服务器,然后执行过滤客户端,这可能会导致系统性能问题,具体取决于表中包含的信息量。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)