我想在数据库表中搜索文件名
如果用户在输入字段中输入了太多单词,我想找到包含所有输入单词的所有文件名。
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中执行此搜索?
答案 0 :(得分:2)
实体框架不在服务器端执行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)));
答案 1 :(得分:0)
无法在SQL中翻译SmartSearch。如果你想在LINQ中使用这个函数,你可能以前获得了yout对象的List,然后过滤:
con.MyFiles.ToList().Where(x => SmartSearch(fname.Text, x.FileName)).ToList();
但这会很慢(因为你得到程序中的所有MyFiles
)
您也可以在SQL中编写存储函数(对于您的smartSearch),在EntityFramework中获取它,然后在LINQ(link to example)中调用此函数。