具有linq查询和存储表达式错误的实体框架

时间:2013-12-14 12:29:34

标签: c# linq entity-framework

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

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

    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中执行此搜索?

2 个答案:

答案 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)中调用此函数。