我有一个搜索部分,可让用户根据搜索框中输入的值查看订单。如果未输入搜索值(例如,日期,客户名称,销售价格等),将显示带有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.
感谢任何帮助......
答案 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所以你自己在那里。