我正在尝试使用此代码从数据库获取特定数据
Bunts = _buntRepository.Bunts
.Where(b => !steel.HasValue || b.SteelCode == steel)
.OrderBy(b => b.CreationTime)
.Skip((page - 1) * _pageSize)
.Take(_pageSize)
实体框架为其生成以下 SQL 语句:
SELECT FIRST (5) SKIP (0)
"B"."BUNTCODE" AS "BUNTCODE",
"B"."BUNTNAME" AS "BUNTNAME",
"B"."BUNTDIAM" AS "BUNTDIAM",
"B"."BUNTSTEEL" AS "BUNTSTEEL",
"B"."BUNTCREATETIME" AS "BUNTCREATETIME"
FROM ( SELECT
"D"."BUNTCODE" AS "BUNTCODE",
"D"."BUNTNAME" AS "BUNTNAME",
"D"."BUNTDIAM" AS "BUNTDIAM",
"D"."BUNTSTEEL" AS "BUNTSTEEL",
"D"."BUNTCREATETIME" AS "BUNTCREATETIME"
FROM "BUNTS" AS "D"
WHERE (("D"."BUNTSTEEL" = @p__linq__1) OR (("D"."BUNTSTEEL" IS NULL) AND (@p__linq__1 IS NULL)))
) AS "B"
ORDER BY "B"."BUNTCREATETIME" ASC
此代码引发文本异常
动态 SQL 错误。
SQL 错误代码 = -804。
数据类型未知。
IBExpert也是如此。参数似乎@p__linq__1问题。如何解决此问题?
我正在使用火鸟 2.1.6.18547
生成的使用@p__linq__1 IS NULL
(实际上是作为? IS NULL
发送到服务器的),这仅在Firebird 2.5中引入。
为了能够使用它,您需要升级到 Firebird 2.5,或者在代码中而不是在查询中处理steel.HasValue
条件,如下所示:
var query _buntRepository.Bunts
if (steel.HasValue)
{
query = query.Where(b => b.SteelCode == steel)
}
Bunts = query.OrderBy(b => b.CreationTime)
.Skip((page - 1) * _pageSize)
.Take(_pageSize);
注意:以上内容未确认生成的查询(这似乎是一个错误)。如果您希望生成结果,则需要:
if (steel.HasValue)
{
query = query.Where(b => b.SteelCode == steel.Value)
}
else
{
query = query.Where(b => b.SteelCode == null)
}