实体框架/LINQ 错误:列前缀“Project1”与查询中使用的表名或别名不匹配
本文关键字:查询 不匹配 别名 错误 LINQ 框架 Project1 前缀 实体 | 更新日期: 2023-09-27 18:33:52
我有以下 LINQ 查询:
var queryEvents = (from p in db.cl_contact_event
where p.time_of_contact >= beginDate && p.time_of_contact < endDate
group p by p.contact_list_name into g
select new PenRawModel
{
listName = g.Key,
download = g.Max(a => a.total_number_of_records),
dials = g.Where(a => a.ov_dial_start_time != null).Count(), //This fails.
//dials = g.Sum(a => a.ov_dial_start_time != null ? 1 : 0), //This works.
agentConnects = g.Sum(a => a.ov_trunk_released_time != null ? 1 : 0),
abandons = g.Sum(a => a.response_status == "DAC" || a.response_status == "DAD" ? 1 : 0),
rightPartyContacts = g.Sum(a => a.response_status == "PTP" || a.response_status == "RPC" ? 1 : 0),
promiseToPays = g.Sum(a => a.response_status == "PTP" ? 1 : 0),
talkTime = g.Sum(a => EntityFunctions.DiffSeconds(a.ov_call_connected_time, a.ov_trunk_released_time)) ?? 0,
wrapTime = g.Sum(a => EntityFunctions.DiffSeconds(a.ov_trunk_released_time, a.record_released_time)) ?? 0
}
运行时,它给我错误:
"列前缀'Project1'与表名不匹配或 查询中使用的别名。表未在 FROM 子句,或者它有一个必须改用的相关名。
失败的原因是:
dials = g.Where(a => a.ov_dial_start_time != null).Count(),
如果我用下面注释掉的代码替换该行代码,则查询工作正常。我更喜欢使用 .哪里/。算数,因为其他人更容易破译和理解代码的意图。
谁能帮我提供线索,说明为什么会失败以及我如何解决它?
编辑 - 下面是从失败的查询发送到 Sybase 数据库的 SQL:
SELECT
1 AS [C1],
[Project2].[contact_list_name] AS [contact_list_name],
[Project2].[C1] AS [C2],
[Project2].[C10] AS [C3],
[Project2].[C2] AS [C4],
[Project2].[C3] AS [C5],
[Project2].[C4] AS [C6],
[Project2].[C5] AS [C7],
CASE WHEN ([Project2].[C6] IS NULL) THEN 0 ELSE [Project2].[C7] END AS [C8],
CASE WHEN ([Project2].[C8] IS NULL) THEN 0 ELSE [Project2].[C9] END AS [C9]
FROM ( SELECT
[Project1].[C1] AS [C1],
[Project1].[C2] AS [C2],
[Project1].[C3] AS [C3],
[Project1].[C4] AS [C4],
[Project1].[C5] AS [C5],
[Project1].[C6] AS [C6],
[Project1].[C7] AS [C7],
[Project1].[C8] AS [C8],
[Project1].[C9] AS [C9],
[Project1].[contact_list_name] AS [contact_list_name],
(SELECT
Count([Filter2].[A1]) AS [A1]
FROM ( SELECT
1 AS [A1]
FROM [mel].[cl_contact_event] AS [Extent2]
WHERE ((([Extent2].[time_of_contact] >= @p__linq__0) AND ([Extent2].[time_of_contact] < @p__linq__1)) AND (([Project1].[contact_list_name] = [Extent2].[contact_list_name]) OR (([Project1].[contact_list_name] IS NULL) AND ([Extent2].[contact_list_name] IS NULL)))) AND ([Extent2].[ov_dial_start_time] IS NOT NULL)
) AS [Filter2]) AS [C10]
FROM ( SELECT
[GroupBy1].[A1] AS [C1],
[GroupBy1].[A2] AS [C2],
[GroupBy1].[A3] AS [C3],
[GroupBy1].[A4] AS [C4],
[GroupBy1].[A5] AS [C5],
[GroupBy1].[A6] AS [C6],
[GroupBy1].[A7] AS [C7],
[GroupBy1].[A8] AS [C8],
[GroupBy1].[A9] AS [C9],
[GroupBy1].[K1] AS [contact_list_name]
FROM ( SELECT
[Filter1].[K1] AS [K1],
Max([Filter1].[A1]) AS [A1],
Sum([Filter1].[A2]) AS [A2],
Sum([Filter1].[A3]) AS [A3],
Sum([Filter1].[A4]) AS [A4],
Sum([Filter1].[A5]) AS [A5],
Sum([Filter1].[A6]) AS [A6],
Sum([Filter1].[A7]) AS [A7],
Sum([Filter1].[A8]) AS [A8],
Sum([Filter1].[A9]) AS [A9]
FROM ( SELECT
[Extent1].[contact_list_name] AS [K1],
[Extent1].[total_number_of_records] AS [A1],
CASE WHEN ([Extent1].[ov_trunk_released_time] IS NOT NULL) THEN 1 ELSE 0 END AS [A2],
CASE WHEN ((N'DAC' = [Extent1].[response_status]) OR (N'DAD' = [Extent1].[response_status])) THEN 1 ELSE 0 END AS [A3],
CASE WHEN ((N'PTP' = [Extent1].[response_status]) OR (N'RPC' = [Extent1].[response_status])) THEN 1 ELSE 0 END AS [A4],
CASE WHEN (N'PTP' = [Extent1].[response_status]) THEN 1 ELSE 0 END AS [A5],
DATEDIFF (second, [Extent1].[ov_call_connected_time], [Extent1].[ov_trunk_released_time]) AS [A6],
DATEDIFF (second, [Extent1].[ov_call_connected_time], [Extent1].[ov_trunk_released_time]) AS [A7],
DATEDIFF (second, [Extent1].[ov_trunk_released_time], [Extent1].[record_released_time]) AS [A8],
DATEDIFF (second, [Extent1].[ov_trunk_released_time], [Extent1].[record_released_time]) AS [A9]
FROM [mel].[cl_contact_event] AS [Extent1]
WHERE ([Extent1].[time_of_contact] >= @p__linq__0) AND ([Extent1].[time_of_contact] < @p__linq__1)
) AS [Filter1]
GROUP BY [K1]
) AS [GroupBy1]
) AS [Project1]
) AS [Project2]
完全
编辑的答案
问题最终出现在Sybex ASE提供程序从LINQ到SQL的转换中:
- 实体框架 4.1(不应影响错误(
- 适用于 SDK 15.7 SED #02 的 Sybex ASE 驱动程序(导致故障(
查询应该使用任何 LINQ sintax 很好地呈现。它们可以生成不同的查询,但它们都应该有效。但是,该提供程序未能正确处理一些可能的sintax。
很高兴知道:
dials = g.Where(a => a.ov_dial_start_time != null).Count(), // fails.
dials = g.Count(a => a.ov_dial_start_time != null), // also fails.
dials = g.Sum(a => a.ov_dial_start_time != null ? 1 : 0), // works.
根据OP的说法,在Where()
过滤器之前添加AsEnumerable()
也可以使其工作。
如果您发现此数据库和提供程序存在一些故障,最好检查将发送到服务器的查询以查找有问题的部分并尝试替代 sintax,直到问题得到解决。您可以使用 toString()
检查将发送到服务器的查询。然后你可以检查sintax,或者直接在服务器中运行它,看看有什么失败。