【问题标题】:Integer Contains Using Linq整数包含使用 Linq
【发布时间】:2023-03-08 08:54:01
【问题描述】:

我在编写一个检查整数中的连续数字是否包含在表的主键中的 linq 查询时遇到了一些困难。因此,假设有一个名为Employees 的表,其主键位于Employees.Id 列上。假设这个主键是 Sql Server 数据类型INT。我想使用 Entity Framework Code First 编写一个 linq 查询,它将返回主键包含字符串 456 的所有员工。类似于:

string filter = "456";

var results = from e in myDbContext.Employees
  where e.Id.Contains(filter)
  select e;

问题是 C# 中没有为整数数据类型提供 Contains 方法...

【问题讨论】:

  • 仅供参考 string.Contains() 不是扩展方法,而是字符串对象的常规方法。
  • @recursive:谢谢,我已编辑问题以包含您的更正。
  • 尽管 X.L.Ant 提供了解决方案,但您可能需要考虑将列的数据类型更改为 charvarchar。数字类型的目的是存储和处理值的幅度,这就是为什么int 类型具有诸如“大于”和“小于”之类的内置函数的原因。如果你的 ID 中的单个符号有实际意义,那么你存储的实际上是一个 code,它恰好使用数字符号,但不代表一个数量级。

标签: c# entity-framework linq casting


【解决方案1】:

试试:

var results = from e in myDbContext.Employees
  where SqlFunctions.StringConvert((double)e.Id).Contains(filter)
  select e;

【讨论】:

  • 你确定ToString()调用会被翻译成SQL吗?
  • 我收到一条错误消息,提示“Linq to Entities 无法识别方法 'System.String ToString()' 方法,并且该方法无法转换为存储表达式。”
  • @X.L.Ant:谢谢,您的解决方案效果很好!我只是在等待 Stack Overflow 的时钟再过一分钟,这样我才能接受你的回答:)
  • 我在 StartsWith 中使用这个函数,它不返回任何值,而 contains 将返回值。我知道 StartsWith 应该返回值,所以查询没有正确执行。知道为什么会这样吗?
  • @CSharper 也许TrimStart()(见this post)可以帮助你。
【解决方案2】:

您可以将两者都转换为字符串,然后进行查询。在你的情况下:

string filter = "456"; var results = from e in myDbContext.Employees where e.Id.ToString().Contains(filter) select e;

【讨论】:

  • ToString() 是否会抛出 NotSupportedException 类型的异常?
猜你喜欢
  • 1970-01-01
  • 2022-01-21
  • 1970-01-01
  • 1970-01-01
  • 2013-01-06
  • 2016-02-05
  • 1970-01-01
  • 2014-01-01
  • 2013-09-25
相关资源
最近更新 更多