Kro*_*oss 0 c# linq entity-framework
我正在尝试使用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);
}
Run Code Online (Sandbox Code Playgroud)
它会生成一个异常,说明LINQ to Entities无法识别我的方法(RemoveDiacritics(String)).
当您使用LINQ-to-Entities时,您的LINQ查询需要转换为"服务器端表达式",在英语中表示数据库可以执行的操作.数据库对您调用的C#方法一无所知,RemoveDiacritics因此您在运行时遇到错误.
您需要先执行查询,然后使用LINQ-to-Objects进行过滤.这可以简单地通过ToList()在过滤之前向查询添加a 来完成.我对流利的语法稍微熟悉一点,所以我把它写成:
q.ToList().Where(i =>
Util.StringUtil.RemoveDiacritics(i.entity.ToString().ToLowerInvariant()).Contains(search) ||
Util.StringUtil.RemoveDiacritics(i.name.ToString().ToLowerInvariant()).Contains(search));
Run Code Online (Sandbox Code Playgroud)
如果你想要查询语法,你将不得不搞砸它.它可能类似于以下但我不是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));
Run Code Online (Sandbox Code Playgroud)
但请注意,这将从服务器返回所有内容,然后执行客户端过滤,这可能会导致系统出现性能问题,具体取决于表中包含的信息量.
| 归档时间: |
|
| 查看次数: |
670 次 |
| 最近记录: |