【问题标题】:LINQ compare string and DB column type 'text'LINQ 比较字符串和 DB 列类型“文本”
【发布时间】:2016-06-13 09:00:58
【问题描述】:

这是我的错误消息The data types text and varchar are incompatible in the equal to operator. 我的代码类似于

var result = db.Table.Where(x => x.columnA == "A").ToList();

我知道原因是 DB 中 columnA 的类型是文本,因此它们无法匹配 而且我无法更新数据库方案。

我可以使用 LINQ to SQL 来做到这一点吗?

更新

这是我的 DAO

[Required]
[StringLength(10)]
public string MessageName { get; set; }

【问题讨论】:

  • 这行得通吗? var 结果 = db.Table.Where(x => x.columnA.ToString() == "A").ToList();

标签: c# asp.net entity-framework linq


【解决方案1】:

TEXT 列不支持等于运算符,即使在 SQL 中也是如此。

您必须这样做,以便您的查询转换为 LIKE 运算符,这可以通过 Contains (LIKE '%str%')、StartsWith (LIKE '%str') 或 EndsWith (LIKE '%str') 来实现.

如果你需要严格的平等,这样的事情应该可以工作:

var result = db.Table.Where(x => x.columnA.StartsWith("A") &&
                                 x.columnA.EndsWith("A")).ToList();

【讨论】:

  • 我想它会很不错,谢谢你的解释,但时间太长了,哈哈。
  • 虽然您总体上是对的,但该示例并未提供严格的相等性。例如,包含“A blah blah A”的字段将匹配。您可以使用 ToString() 为 Linq To SQL 提供 ==。但是,在 Text 字段上执行 == 是无稽之谈。
  • @CetinBasoz 你是对的。这是一个旧项目,我无法更新那部分
  • 没用,我收到了Argument data type ntext is invalid for argument 1 of left function
【解决方案2】:

你可以用这个(我没有测试过代码)

var result = db.Table.Where(x => x.columnA.Contains("A")).ToList();

【讨论】:

    【解决方案3】:

    您可以将有问题的列转换为字符串吗?我没有任何方法可以对此进行测试,因为我没有 Text 类型的数据库。

    var result = db.Table.Where(x => x.columnA.ToString() == "A").ToList();
    

    【讨论】:

    • 开头是字符串
    • 这是对 OP 问题的实际答案。
    • @CetinBasoz 这将在我的问题中导致同样的错误。您可以在我的问题中看到更新部分。 columnA 是开头的字符串。
    • 不,它不会导致 Linq To SQL 出错,并且可以正常工作。你是什​​么意思,“columnA 开头是字符串”?如果是 text 或 varchar(), ...... 还能是什么?
    • 我不相信您可以使用与text 的相等比较,这是我从未使用过的数据类型,但我确实记得阅读过有关 LINQ 的问题。如果您查看已生成的模型,您将看到 ColumnA 的样子。
    【解决方案4】:

    我尝试了上述所有解决方案,但没有一个修复程序适合我,所以我在这里发布适合我的修复程序

     var result = db.Table.Where(x => Convert.ToString(x.columnA) == "A").ToList();
    

    【讨论】:

    • 这比@christiandev 的回答要好,因为它不会在 x.columnA 为空或为空时抛出异常。
    【解决方案5】:

    我遇到了同样的问题,没有一个字符串转换解决方案对我有用。 问题是我有一个 'text' 用于此列的数据类型(因为我是从 sqlite 迁移它的)。 解决方案:只需将数据类型更改为 `'nvarchar()' 并重新生成表即可。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-10-29
      • 2014-06-28
      • 2017-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-24
      相关资源
      最近更新 更多