带有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中进行搜索?

带有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中调用此函数(示例链接)。