在LINQ to SQL中使用Where子句时出错?

时间:2015-01-24 01:03:16

标签: c# sql linq lambda runtime-error

我在将过滤条件应用于LINQ to SQL表时遇到错误。 有没有办法在LINQ to SQL中使用Where条件创建SQL查询?

错误: “方法”布尔值等于(System.String,System.String,System.StringComparison)'没有支持的SQL转换。“

以下是代码

  public IQueryable<DocumentReplacementPack> GetDocumentReplacementPack(string state,int typeID)
    {
        if (this.DataContext.DocumentReplacementPacks.Count() > 0)
            **return this.DataContext.DocumentReplacementPacks.Where(d => string.Equals(d.State, state, StringComparison.InvariantCultureIgnoreCase));**
        else
            return this.DataContext.DocumentReplacementPacks;
    }

2 个答案:

答案 0 :(得分:1)

不,这不是错误,遗憾的是,这比你想象的要多得多。让我们看看linq如何从高级别将表达式转换为sql

this.DataContext.DocumentReplacementPacks.Where(d => string.Equals(d.State, state, StringComparison.InvariantCultureIgnoreCase));

这将生成一个类似于

的sql调用
select * from [DocumentReplacementPacks] where ??

现在将要发生的是表达式将进入string.Equals调用,因为在sql中没有REAL等效的string.Equals,linq不知道如何生成sql字符串。由于string.Equals是一个c#函数而不是一个sql函数。一个非常好的例子就像是

public bool AreEqual(string one, string two){
     return one.ToCharArray()[0] == two.ToCharArray()[0];
}

现在这是一个非常简单的例子,但想想你是否有这样的linq表达式:

return this.DataContext.DocumentReplacementPacks.Where(d => AreEqual(d.State, state));

您希望如何翻译?没有办法,linq将如何知道函数的确切行为。

解决这个问题的方法是切换到==,因为linq知道如何翻译它。

return this.DataContext.DocumentReplacementPacks.Where(d =>d.State == state); 

让数据库执行InvariantCultureIgnoreCase,现在如果这不是一个选项,你只需要将数据读入内存并进行调用。

this.DataContext.DocumentReplacementPacks.ToList().Where(d => string.Equals(d.State, state, StringComparison.InvariantCultureIgnoreCase));

但我不建议,因为将整个数据集读入内存可能非常昂贵。

* OFF TOPIC *

此外,我正在查看您的代码,我强烈建议您更改this.DataContext.DocumentReplacementPacks.Count() > 0) 至  this.DataContext.DocumentReplacementPacks.Any())

Explanation。我常常对人们在没有真正了解IEnumerable / IQuerable的情况下如何使用linq感到失望,但您如何成为更好的开发人员呢?

答案 1 :(得分:0)

MS SQL默认情况下处理字符串不区分大小写,所以你应该使用'==',它可以由LINQ2SQL翻译