【问题标题】:LIKE on DECIMAL fieldsLIKE 在 DECIMAL 字段上
【发布时间】:2014-04-15 12:19:41
【问题描述】:

我有一个搜索部分,可以让用户根据在搜索框中输入的值查看订单。如果未输入搜索值(例如,日期、客户名称、销售价格等),则会显示 OrderDate DESC 的前 10 条记录。下表包含必填列。

CREATE TABLE OrderDetails
(
    OrderId INT IDENTITY(1, 1) PRIMARY KEY,
    OrderPrice NUMERIC(18, 2),
    OrderDate DATETIME  
)

INSERT INTO dbo.OrderDetails
SELECT 100.18 OrderPrice, GETDATE() OrderDate
UNION ALL
SELECT 300.62 OrderPrice, GETDATE() OrderDate
UNION ALL
SELECT 9300.12 OrderPrice, GETDATE() OrderDate

每当用户输入 SalesPrice 时,我想从 EntityFramework 在 VB.Net 中运行如下查询。 请注意,SalesPrice 是 DECIMAL 字段

SELECT * FROM dbo.OrderDetails WHERE OrderPrice LIKE '%9300%'

我正在使用 System.Data.Entity.dll 版本 3.5.0.0。我开始写它如下:

Dim query = From o In e.OrderDetails Select o
If (Not String.IsNullOrEmpty(sPrice)) Then
   query = query.Where(Function(i) i.SalesPrice.ToString().Contains(sPrice))
End If

请注意,SalesPrice 是 DECIMAL 字段,我无法使用 Contains。因此我不得不使用 ToString()。但我收到以下错误。

LINQ to Entities does not recognize the method 'System.String ToString()' method, and this method cannot be translated into a store expression.

感谢任何帮助....

【问题讨论】:

  • 使用LIKE在十进制字段中搜索是什么意思。假设您的值中有129300和19300。这个价格有什么关系?
  • @HamletHakobyan:即使我需要使用StartsWith或EndsWith,我仍然需要将十进制值转换为ToString()。
  • @Mr CoDeXeR:请恢复建议的编辑。我没有足够的权限拒绝您的编辑。这个问题具体是一个实体框架问题。保留查询只是为了提供更多详细信息.....
  • @SharminJose 元标签不应包含在标题中。您为您的问题明确标记了实体框架,这就是它们的用途。

标签: sql vb.net entity-framework .net-3.5 sql-like


【解决方案1】:

L2E 不知道 ToString,您必须使用 SqlFunctions 静态方法进行转换。

我不确定我的 VB 语法是否正常,但可以。

query = query.Where(Function(i) SqlFunctions.StringConvert(CType(i.SalesPrice, System.Nullable(Of Decimal)).Contains(sPrice))

C# 语法是:

query = query.Where(x => SqlFunctions.StringConvert((decimal?) x.SalesPrice).Contains(sPrice));

【讨论】:

  • 你确定它可以在 EF 3.5 上运行吗?我在其他一些例子中见过它,但找不到任何地方告诉它可以在 3.5 中使用。
  • SqlFunctions 在 .Net 3.5 中不可用,从 4.0 开始
  • 我刚刚编辑了问题(也将其添加到标题中)以突出显示我使用的版本。我已经在问题中提到过,但没有强调它。感谢您的帮助...
【解决方案2】:

你也许可以在 SQL 中做这样的事情:

SELECT * FROM dbo.OrderDetails WHERE CAST(OrderPrice, VarChar(10)) LIKE '%9300%'

如果您在 WHERE 子句中没有其他检查以防止全表扫描,这在服务器端将非常低效。

我不会说 LINQ,所以你自己在那里。

【讨论】:

  • 问题是关于如何在 EF 3.5 上将 LIKE 运算符应用于 Decimal 字段。我实际上已在问题文本本身中添加了该信息。但是有人在 DECIMAL 字段上将其更改为 LIKE。
  • 没问题。我只是在回复第二组代码并指出您可以使用这样的构造对数字进行字符串操作。
猜你喜欢
  • 2016-01-24
  • 2015-01-17
  • 1970-01-01
  • 2013-04-17
  • 1970-01-01
  • 2013-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多