繁体   English   中英

LINQ to Entities无法识别方法'System.String [] Split(Char [])',并且该方法无法转换为商店表达式

[英]LINQ to Entities does not recognize the method 'System.String[] Split(Char[])' method, and this method cannot be translated into a store expression

我有一个功能

private List<AccountViewModel> GetWorkableAccountsForTheMonth()
        {
            var result = GetAllAcountsForLoggedInAgents()
            .Where
                (
                    a =>
                        ("Deceased,DND,WN,WI,NC,NORESPONSE,SKIP,SHIFTED,SFU".Split(',').Any(x => x == a.DispCode.GetProperDispCode()))                            
                ).ToList();

        return result;

        }

GetAllAcountsForLoggedInAgents()的类型为IQueryable。 GetProperDispCode如下

public static string GetProperDispCode(this string dispCode)
        {
            return string.IsNullOrWhiteSpace(dispCode) ? string.Empty : dispCode;
        }

在尝试执行此操作时,遇到以下错误

LINQ to Entities无法识别方法'System.String [] Split(Char [])',并且该方法无法转换为商店表达式。

如果我将类型更改为IEnumerable( GetAllAcountsForLoggedInAgents()。ToList( )),它可以工作...但是我现在不想从IQuerable转换为IEnumerable

我必须做出什么改变?

编辑

所以,现在我进行了更改

string[] dispCodeArrays = "Deceased,DND,WN,WI,NC,NORESPONSE,SKIP,SHIFTED,SFU".Split(',');
            var result = GetAllAcountsForLoggedInAgents()
            .Where
                (
                    a =>
                        (dispCodeArrays.Any(x => x == a.DispCode.GetProperDispCode()))                       
                ).ToList();

现在的错误是

附加信息:LINQ to Entities无法识别方法'System.String GetProperDispCode(System.String)',并且该方法无法转换为商店表达式。

如何克服呢?

在将LINQ to Entities代码编写时,只能使用EF可以将其转换为SQL的.NET代码,在您的情况下则不能。 无需使用String.Split将文字String拆分为数组,只需创建一个数组即可。

IQueryable保存将在数据源(例如,数据库实体)上执行的查询。 它支持在最终将所有内容作为单个查询执行时可以转换为查询的操作。

您得到的异常是因为它无法以适合最终查询的方式转换代码。 您正在尝试进行数据尚不存在的数据操作。

最后,当您对方法说“ ToList时,您提到它正在工作。 因为当您说ToListFirstOrDefault和与此类FirstOrDefault操作时,实际上是将数据从DataSource提取到内存中。 因此,您要尝试执行的操作将具有要执行的数据。

如果要编写LINQ to Entity查询,则只能编写可通过实体框架转换为SQL 因为创建查询时A Linq to Entity会定义查询表达式并将其存储在查询变量中,所以通常不会执行查询,直到开始对查询变量进行迭代为止。 为了立即执行,您必须使用.ToList() ,并且您可以使用Non Sql Convertible代码。

因此,对于您的第一个Issue,您要么必须在linq表达式之外创建String数组。 或使用.ToList()将数据提取到内存中。

并且随着您更新问题a.DispCode.GetProperDispCode()无法直接转换为SQL查询。 因此,您必须使用ToList()获取内存中的数据,然后使用该方法。

或使用将保存a.DispCode.GetProperDispCode()数据的a.DispCode.GetProperDispCode()供您使用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM