我将 Firebird ADO.NET 提供程序版本 5.5 与实体框架 5 结合使用。对于 Firebird UTF-8 数据库,带有投影的 LINQ to SQL 查询(包括有条件地将字符串属性设置为常量)会导致错误“超出实现限制。块”如果至少存在两个提到的字符串投影,则大小超出实现限制。
例如,我查询一个存储比萨店的简单数据库:
var pizzerias =
from pizzeria in demoEntities.Pizzerias
select new
{
pizzeria.ID,
pizzeria.Name,
// Following two projections are the issue since Firebird add two times VARCHAR(8191) in case State and City are empty.
// It works with one of these projections, but not with two.
State = pizzeria.State != "CA" ? pizzeria.State : "-",
City = pizzeria.City != "Mountain View" ? pizzeria.City : "-"
};
州和城市的两种投影会导致上述错误(如果仅存在一种投影,则不会发生错误)。
生成的 SQL 将字符串常量转换为 VARCHAR(8191),这很可能是错误的原因:
SELECT
"A"."ID" AS "ID",
"A"."NAME" AS "NAME",
CASE WHEN (CAST(_UTF8'CA' AS VARCHAR(8191)) <> "A"."STATE") THEN "A"."STATE" ELSE CAST(_UTF8'-' AS VARCHAR(8191)) END AS "C1",
CASE WHEN (CAST(_UTF8'Mountain View' AS VARCHAR(8191)) <> "A"."CITY") THEN "A"."CITY" ELSE CAST(_UTF8'-' AS VARCHAR(8191)) END AS "C2"
FROM "PIZZERIAS" AS "A"
当直接对数据库执行 SQL(使用 IBExpert)时,会引发相同的错误。
奇怪的是,在使用 Win1252 编码的相同数据库上不会发生此错误。
顺便说一句:我知道样本中的预测没有意义,我可以轻松解决该问题。但在更复杂的场景中我也遇到了类似的问题,我无法如此轻松地解决问题。
我想了解这里发生了什么以及为什么在 Win1252 数据库上不会出现问题。一种解决方案是在投影中使用较小的 VARCHAR,但我不知道如何告诉 ADO.NET Firebird 提供程序执行此操作。