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

时间:2016-02-11 03:31:18

标签: c# linq

我有一个功能

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无法识别方法&#39; System.String [] Split(Char [])&#39;方法,此方法无法转换为商店表达式。

如果我将类型更改为IEnumerable( GetAllAcountsForLoggedInAgents()。ToList()),它可以工作......但我不想在此时从IQuerable转换为IEnumerable < / p>

我必须做出哪些改变?

修改

所以,现在我已将更改改为

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无法识别方法&#39; System.String GetProperDispCode(System.String)&#39;方法,此方法无法转换为商店表达式。

如何克服这个问题?

3 个答案:

答案 0 :(得分:3)

当你编写LINQ to Entities代码时,你只能使用EF可以转换为SQL的.NET代码,在你的情况下它不能。而不是使用String.Split将文字String拆分成数组,只需创建一个数组。

答案 1 :(得分:1)

IQueryable保存将在DataSource上执行的查询,例如在db实体上。它支持可以转换为查询的操作,而所有内容最终都作为单个查询执行。

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

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

答案 2 :(得分:1)

如果您正在编写SQL查询,则只能编写可由实体框架转换为Linq to Entity的代码。因为查询表达式是.ToList() 在创建查询时定义并存储在查询变量中,通常不会在查询变量的迭代开始之前执行查询。要立即执行,您必须使用Non Sql Convertible,并且可以使用String代码。

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

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

或者使用保存{{1}}数据的属性供您使用。