2014-12-27 37 views
1

我试图从数据库中使用此代码火鸟和Entity Framework错误-804

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

回答

0

生成的用途@p__linq__1 IS NULL(这实际上是发送作为? IS NULL到服务器),这是唯一的introduced in Firebird 2.5

为了能够使用这个您可能需要升级到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) 
} 
+0

好吧,似乎它真的不想正确处理可空类型。你能指导我在哪里阅读有关使用FB 2.1和EF I将在未来见面的相关问题?或者我应该升级到2.5而不在意? – Pallaris

+0

@Pallaris我建议你升级到2.5。 –

+0

您可能需要将'steel.Value'从Where中取出,方法是首先将其分配给局部变量。 –