【发布时间】:2018-11-16 14:43:11
【问题描述】:
我正在为以下 linq to sql 查询绞尽脑汁。这个想法是获得最小的下一个整数,与所有 REG_CODE 项目相比。此字段 (REG_CODE) 是一个 varchar(10) 字段。 我正在尝试将以下 tsql 转换为 linq-to-entities (EF 6.0):
SELECT TOP 1 CAST( [Extent1].[REG_CODE] AS int) + 1
FROM [dbo].[Notifications] [Extent1]
WHERE NOT ([Extent1].[REG_CODE] LIKE N'%~[a-z]%' ESCAPE N'~') AND (1 = (ISNUMERIC([Extent1].[REG_CODE]))) AND
NOT EXISTS(SELECT * FROM [dbo].[Notifications] t2 WHERE CAST( t2.REG_CODE AS int) = CAST( [Extent1].[REG_CODE] AS int) + 1 )
ORDER BY [Extent1].[REG_CODE]
(注意 + 1 的,我想要下一部分) 设计并不是真的那么糟糕。字段 [REG_CODE] 应该是一个整数字段,但它不是,也不会很快成为。
这个:
float notificationMaxRegCodeNumeric =
db.Notifications.Where(not => not.Reg_Code != null && !not.Reg_Code.Contains("[a-z]") && SqlFunctions.IsNumeric(not.Reg_Code) == 1)
.OrderByDescending(not => not.Reg_Code)
.Select(not => not.Reg_Code)
.Cast<int>()
.Max();
成功转换为:
SELECT MAX(CAST( [Extent1].[REG_CODE] AS int)) AS[A1]
FROM[dbo].[Notifications] AS[Extent1]
WHERE ([Extent1].[REG_CODE] IS NOT NULL) AND(NOT([Extent1].[REG_CODE] LIKE N'%~[a-z]%' ESCAPE N'~')) AND(1 = (ISNUMERIC([Extent1].[REG_CODE])))
到目前为止,我得到了:
int nextNotificationMaxRegCodeNumericInt = db.Notifications.Where(not =>
not.Reg_Code != null && !not.Reg_Code.Contains("[a-z]") &&
SqlFunctions.IsNumeric(not.Reg_Code) == 1 &&
db.Notifications.Any(klainternal => not.Reg_Code.Cast<int>() == klainternal.Reg_Code.Cast<int>())
)
.OrderByDescending(not => not.Reg_Code)
.Select(not => not.Reg_Code)
.Cast<int>();
但它会抛出:
DbExpressionBinding 需要一个带有集合 ResultType` 的输入表达式。
还有Convert.ToInt32()在扔:
linq to entity 无法识别方法 'int32 toint32(system.string)' 方法`
(.Max() 与我要查找的内容并不真正相关,它在查询的工作部分中)
有什么建议吗?
【问题讨论】:
-
我认为不需要使用 c# 将字段转换为整数,因为它应该已经被定义为这样,不是吗?
-
Cast是一种 Linq 方法,它将强制转换集合中的所有值,而不是单个值(我怀疑即使正确使用它也会转换为 SQL)。您需要一个设置为转换为所需 SQL 的方法。我不相信有什么内置的,但看看这个关于如何创建你自己的问题stackoverflow.com/questions/5971521/… -
@user1666620 REG_CODE 字段是一个 varchar(10) 字段,因此与所有 REG_CODE 项相比,我需要最小的下一个整数
-
当您尝试执行数字顺序时,
ORDER BY REG_CODE的 SQL 是否危险,或者REG_CODE是否包含前导零? -
你能用
Convert.ToInt32显示代码吗?这是 LINQ to Entities 的正确方法 - 您使用的是什么版本的 EF?你在使用 EF Core 吗?
标签: c# entity-framework linq linq-to-entities expression-trees