当列是数字但是在WHERE中有一个字符串时,如何使用LINQ查询数据库?

时间:2017-12-26 22:41:44

标签: c# linq

我正在使用此代码:

query = String.IsNullOrEmpty(options.PhraseNum) ?
               query :
               query.Where(w => w.PhraseNum == Convert.ToInt32(options.PhraseNum));

但是我收到错误:

  

LINQ to Entities无法识别方法'Int32 ToInt32(System.String)'方法,并且此方法无法转换为商店表达式。

有没有办法可以在LINQ中执行此操作,如果不能,我怎么能在此之外进行转换并且如果字符串不为null,则转换不会导致异常?

2 个答案:

答案 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方法调用本身内联声明。