我正在使用此代码:
query = String.IsNullOrEmpty(options.PhraseNum) ?
query :
query.Where(w => w.PhraseNum == Convert.ToInt32(options.PhraseNum));
但是我收到错误:
LINQ to Entities无法识别方法'Int32 ToInt32(System.String)'方法,并且此方法无法转换为商店表达式。
有没有办法可以在LINQ中执行此操作,如果不能,我怎么能在此之外进行转换并且如果字符串不为null,则转换不会导致异常?
答案 0 :(得分:7)
如果字符串可以解析为query
,则只修改int
,如果它不为空或空,则隐式检查:
if (int.TryParse(options.PhraseNum, out var phraseNum))
{
query = query.Where(w => w.PhraseNum == phraseNum);
}
在C#7之前,语法是
int phraseNum;
if (int.TryParse(options.PhraseNum, out phraseNum))
etc.
答案 1 :(得分:2)
看起来LINQ正试图在服务器端评估表达式Convert.ToInt32(options.PhraseNum)
,作为WHERE子句的一部分。
重做代码,以便在查询表达式之外的客户端显式转换变量:
Int32 phrase_num = String.IsNullOrEmpty(options.PhraseNum) ? 0 : Convert.ToInt32;
query = String.IsNullOrEmpty(options.PhraseNum) ? query : query.Where(w => w.PhraseNum == phrase_num);
或者总体来说是一个更整洁的方法:
if(!String.IsNullOrEmpty(options.PhraseNum))
{
Int32 phrase_num = Convert.ToInt32(options.PhraseNum);
query = query.Where(w => w.PhraseNum == phrase_num);
}
我认为应该解决问题并保留预期的程序逻辑。
编辑:如果您使用的是最新的C#版本,我赞同Gert Arnold的方法,其中out参数可以在TryParse方法调用本身内联声明。