喜欢DECIMAL字段

时间:2014-03-11 18:20:01

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

我有一个搜索部分,可让用户根据搜索框中输入的值查看订单。如果未输入搜索值(例如,日期,客户名称,销售价格等),将显示带有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.

感谢任何帮助......

2 个答案:

答案 0 :(得分:0)

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));

答案 1 :(得分:-1)

您可以在SQL中执行以下操作:

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

如果您在WHERE子句中没有其他检查来阻止全表扫描,那么在服务器端这将是非常低效的。

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