C# LINQ to实体无法识别方法';System.String[]Split(Char[])和#x27;方法,而此方法无法转换为存储表达式

C# LINQ to实体无法识别方法';System.String[]Split(Char[])和#x27;方法,而此方法无法转换为存储表达式,c#,linq,C#,Linq,我有一个函数作为 private List<AccountViewModel> GetWorkableAccountsForTheMonth() { var result = GetAllAcountsForLoggedInAgents() .Where ( a => ("Deceased,DND

我有一个函数作为

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;

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

LINQ to Entities无法识别方法“System.String[]Split(Char[])”方法,并且无法将此方法转换为存储表达式

如果我将类型更改为IEnumerable(getAllaccountsforLoggedInagents().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 GetPropertySpCode(System.String)”方法,此方法无法转换为存储表达式。


如何克服这个问题?

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

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


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

当您将LINQ写入实体代码时,您只能使用EF可以转换为SQL的.NET代码,而在您的情况下,EF不能这样做。不要使用
String.Split
将文本
String
拆分为数组,只需创建一个数组。

如果要编写
LINQ to Entity
查询,则只能编写可由Entity framework转换为
SQL
的代码。因为查询表达式是 定义并存储在查询变量中创建查询时,通常在对查询变量进行迭代之前不会执行查询。要立即执行,您必须使用
.ToList()
,并且可以使用
非Sql可转换的
代码

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

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


或者使用一个属性,该属性将保存
a.DispCode.getPropertySpCode()
的数据供您使用。

您可以尝试使用LinqKit和可扩展的扩展方法来克服linq to实体中调用表达式的缺失部分。根据您的建议,我已经通过在外部拆分数组进行了更改。但是与a.DispCode.getPropertySpCode()相比,它抛出了错误。我怎么办?请看地图edit@priyanka.sarkar新问题的答案是答案中的第一句话
当您将LINQ写入实体代码时,您只能使用EF可以转换为SQL的.NET代码,而在您的情况下,EF无法转换为SQL
。您无法编写
a.DispCode.getPropertySpCode()
,因为EF不知道如何将
getPropertySpCode
的实现转换为SQL。
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();