【问题标题】:entity framework with linq query and stored expression error具有 linq 查询和存储表达式错误的实体框架
【发布时间】:2013-12-14 12:29:34
【问题描述】:

我想在数据库表中搜索文件名

如果用户在输入字段中输入的单词过多,我想查找包含所有输入单词的所有文件名。

    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 中创建存储表达式来执行此搜索?

【问题讨论】:

    标签: c# linq entity-framework


    【解决方案1】:

    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)));
    

    【讨论】:

      【解决方案2】:

      SmartSearch 无法在 SQL 中翻译。如果你想在 LINQ 中使用这个函数,你可以先获取你的对象列表,然后过滤:

      con.MyFiles.ToList().Where(x => SmartSearch(fname.Text, x.FileName)).ToList();
      

      但这会很慢(因为你在程序中得到了所有MyFiles

      您也可以在 SQL 中编写存储函数(用于您的 smartSearch),在 EntityFramework 中获取它,然后在 LINQ 中调用此函数 (link to example)。

      【讨论】:

        猜你喜欢
        • 2021-12-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多