我有一个功能
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;方法,此方法无法转换为商店表达式。
如何克服这个问题?
答案 0 :(得分:3)
当你编写LINQ to Entities代码时,你只能使用EF可以转换为SQL的.NET代码,在你的情况下它不能。而不是使用String.Split
将文字String
拆分成数组,只需创建一个数组。
答案 1 :(得分:1)
IQueryable
保存将在DataSource上执行的查询,例如在db实体上。它支持可以转换为查询的操作,而所有内容最终都作为单个查询执行。
您获得的异常是因为它无法以适合最终查询的方式转换您的代码。您正在尝试进行数据管理,其中数据尚不存在。
最后,您提到当您对该方法说ToList
时它正在工作。因为当你说ToList
,FirstOrDefault
和类似的操作时,数据实际上是从DataSource提取到内存的。因此,您尝试执行的操作将具有要执行的数据。
答案 2 :(得分:1)
如果您正在编写SQL
查询,则只能编写可由实体框架转换为Linq to Entity
的代码。因为查询表达式是.ToList()
在创建查询时定义并存储在查询变量中,通常不会在查询变量的迭代开始之前执行查询。要立即执行,您必须使用Non Sql Convertible
,并且可以使用String
代码。
因此,对于您的第一个问题,您必须在linq表达式之外创建.ToList()
数组。或使用a.DispCode.GetProperDispCode()
将数据提取到内存中。
当您更新问题时ToList()
无法直接转换为SQL查询。因此,您必须使用a.DispCode.GetProperDispCode()
来获取内存中的数据,然后使用该方法。
或者使用保存{{1}}数据的属性供您使用。