【问题标题】:Error while using Where clause in LINQ to SQL?在 LINQ to SQL 中使用 Where 子句时出错?
【发布时间】:2015-01-24 01:03:16
【问题描述】:

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

错误: “方法 'Boolean Equals(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;
    }

【问题讨论】:

  • 你试过 (d => d.State == state) 吗?

标签: c# sql linq lambda runtime-error


【解决方案1】:

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

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

这将生成一个类似于

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

现在将要发生的是表达式将到达string.Equals 调用,并且由于在 sql 中没有真正的 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));

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

* 题外话 *

另外我正在查看您的代码,我强烈建议更改 this.DataContext.DocumentReplacementPacks.Count() &gt; 0)this.DataContext.DocumentReplacementPacks.Any())

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

【讨论】:

    【解决方案2】:

    MS SQL 默认不区分大小写,所以你应该使用 '==' 可以被 LINQ2SQL 翻译

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-11-25
      • 1970-01-01
      • 2015-08-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-21
      • 1970-01-01
      相关资源
      最近更新 更多