带有linq查询和存储表达式错误的实体框架
本文关键字:错误 实体 框架 表达式 存储 linq 查询 带有 | 更新日期: 2024-09-22 13:03:55
我想在数据库表中搜索文件名
如果用户在输入字段中输入了太多单词,我希望找到包含所有输入单词的所有文件名。
private bool SmartSearch(string textTosSearchIn, string textTosSearch)
{
textTosSearch = textTosSearch.ToLower();
textTosSearch = textTosSearchIn.ToLower();
var allStrings = textTosSearch.Split(' ');
foreach (var item in allStrings)
{
if (!textTosSearchIn.Contains(item.Trim()))
{
return false;
}
}
return true;
}
r = con.MyFiles.Where(x => SmartSearch(fname.Text, x.FileName)).ToList();
这个错误触发了
LINQ to Entities无法识别方法"Boolean SmartSearch(System.String,System.String)"方法,并且此方法无法转换为存储表达式。
我如何制作一个存储表达式来在linq中进行搜索?
Entity Framework不在服务器端执行C#代码。它将客户端的C#代码转换为SQL文本命令,然后在服务器上执行SQL。因此,在您的情况下,EF无法将自定义C#方法SmartSearch
转换为SQL。
从您的代码来看,数据库中似乎有FileName
字段,您用空格分隔了它(对我来说很奇怪)。然后检查客户端上的文本中是否包含这些部分。不幸的是,String.Split
无法转换为SQL,因此请将过滤转移到客户端
con.MyFiles.AsEnumerable() // transfers all data from db to client
.Where(f => SmartSearch(fname.Text, f.FileName))
.ToList();
或者考虑重新使用您的过滤算法。例如,在我看来,获取所有包含任何输入单词的文件名如下:
var words = fname.Text.Split();
var files = con.MyFiles.Where(f => words.Any(w => f.FileName.Contains(w)));
SmartSearch无法在SQL中转换。如果你想在LINQ中使用这个函数,你可以先得到yout对象的列表,然后过滤:
con.MyFiles.ToList().Where(x => SmartSearch(fname.Text, x.FileName)).ToList();
但这将是缓慢的工作(因为你在程序中得到了所有的MyFiles
)
此外,您可以在SQL中编写存储函数(用于智能搜索),在EntityFramework中获取它,然后在LINQ中调用此函数(示例链接)。