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