LINQ NHibernate-为什么我在HAVING子句中得到的列“”无效?
我想获取一个表中的最后一个条目,并将它们与另一个表连接,以生成不匹配的条目 我得到以下错误LINQ NHibernate-为什么我在HAVING子句中得到的列“”无效?,nhibernate,linq-to-sql,Nhibernate,Linq To Sql,我想获取一个表中的最后一个条目,并将它们与另一个表连接,以生成不匹配的条目 我得到以下错误 Column is invalid in the HAVING clause because it is not contained in either an aggregate function or the GROUP BY clause 对于CFWD和天平 运行以下命令时 var lastEntries = from s in session.Query<Statement>()
Column is invalid in the HAVING clause
because it is not contained in either
an aggregate function or the GROUP BY clause
对于CFWD和天平
运行以下命令时
var lastEntries = from s in session.Query<Statement>()
group s by s.Customer.Id into grp
select grp.OrderByDescending(g => g.Id).First();
var customers = session.Query<Customer>();
var balances = from s in lastEntries
join c in customers on s.Customer.Id equals c.Id
where s.Customer.Balance != s.CFwd
select s ;
foreach (var line in balances )
{
...
}
SELECT [t5].[test], [t5].[Id], [t5].[TransactionDate],
[t5].[CustomerId], [t5].[RefNo], [t5].[Description],
[t5].[BFwd], [t5].[Amount], [t5].[CFwd],
[t5].[TransactionTypeId]
FROM (
SELECT [t1].[Id]
FROM [Statement] AS [t0]
INNER JOIN [Customer] AS [t1] ON [t1].[Id] = [t0].[CustomerId]
GROUP BY [t1].[Id]
) AS [t2]
OUTER APPLY (
SELECT TOP (1) 1 AS [test], [t3].[Id], [t3].[TransactionDate],
[t3].[CustomerId], [t3].[DocRefNo], [t3].[Description],
[t3].[BFwd], [t3].[Amount], [t3].[CFwd],
[t3].[TransactionTypeId]
FROM [Statement] AS [t3]
INNER JOIN [Customer] AS [t4] ON [t4].[Id] = [t3].[CustomerId]
WHERE [t2].[Id] = [t4].[Id]
ORDER BY [t3].[Id] DESC
) AS [t5]
INNER JOIN [Customer] AS [t6] ON (
SELECT [t7].[Id]
FROM [Customer] AS [t7]
WHERE [t7].[Id] = [t5].[CustomerId]
) = [t6].[Id]
WHERE [t6].[Balance] <> [t5].[CFwd]
ORDER BY [t5].[Id] DESC
更新
以下是NHibernate生成的SQL语句
select statement0_.Id as Id0_,
statement0_.TransactionDate as Transact2_0_,
statement0_.RefNo as RefNo0_,
statement0_.Description as Descript4_0_,
statement0_.BFwd as BFwd0_,
statement0_.Amount as Amount0_,
statement0_.CFwd as CFwd0_,
statement0_.TransactionTypeId as Transact8_0_,
statement0_.CustomerId as CustomerId0_
from Statement statement0_, Customer customer1_
where customer1_.Id=statement0_.CustomerId
group by statement0_.CustomerId
having customer1_.Balance<>statement0_.AmountCFwd
而LINQPad生成以下
var lastEntries = from s in session.Query<Statement>()
group s by s.Customer.Id into grp
select grp.OrderByDescending(g => g.Id).First();
var customers = session.Query<Customer>();
var balances = from s in lastEntries
join c in customers on s.Customer.Id equals c.Id
where s.Customer.Balance != s.CFwd
select s ;
foreach (var line in balances )
{
...
}
SELECT [t5].[test], [t5].[Id], [t5].[TransactionDate],
[t5].[CustomerId], [t5].[RefNo], [t5].[Description],
[t5].[BFwd], [t5].[Amount], [t5].[CFwd],
[t5].[TransactionTypeId]
FROM (
SELECT [t1].[Id]
FROM [Statement] AS [t0]
INNER JOIN [Customer] AS [t1] ON [t1].[Id] = [t0].[CustomerId]
GROUP BY [t1].[Id]
) AS [t2]
OUTER APPLY (
SELECT TOP (1) 1 AS [test], [t3].[Id], [t3].[TransactionDate],
[t3].[CustomerId], [t3].[DocRefNo], [t3].[Description],
[t3].[BFwd], [t3].[Amount], [t3].[CFwd],
[t3].[TransactionTypeId]
FROM [Statement] AS [t3]
INNER JOIN [Customer] AS [t4] ON [t4].[Id] = [t3].[CustomerId]
WHERE [t2].[Id] = [t4].[Id]
ORDER BY [t3].[Id] DESC
) AS [t5]
INNER JOIN [Customer] AS [t6] ON (
SELECT [t7].[Id]
FROM [Customer] AS [t7]
WHERE [t7].[Id] = [t5].[CustomerId]
) = [t6].[Id]
WHERE [t6].[Balance] <> [t5].[CFwd]
ORDER BY [t5].[Id] DESC
我尝试重新排列语句以允许分组,但似乎做得不对
哪种语法正确可以防止错误?我认为这可能是一个简单的打字错误 在LinqPad中的示例中,where子句与加入的客户进行比较 但是,在LinqToNHibernate示例中,where子句与来自lastEntries的s进行比较,而不是与加入的客户c进行比较 因此,也许对于您的NHibernate示例,您只需要
var balances = from s in lastEntries
join c in customers on s.Customer.Id equals c.Id
where c.Balance != s.CFwd
select s ;
事实证明,我是在用SQL方式而不是对象。我需要的唯一声明是
var lastEntries = from s in session.Query<Statement>()
group s by s.Customer.Id into grp
select grp.OrderByDescending(g => g.Id).First();
并为语句对象的所有列添加分组,如下所示
var lastEntries = from s in session.Query<Statement>()
group s by new
{
s.Customer
, s.Id
...
} into grp
select grp.OrderByDescending(g => g.Id).First();
当您在LINQPad中进行测试时,您是否在同一个数据库上运行它?是的。我从LINQPad复制了语句,并用NHibernate替换替换了复数表名。即使重新安排也会产生同样的异常。鉴于NHibernate抱怨分组,我假设我需要在最后一条语句中添加一个分组子句,但我认为这并不正确。它不一定总是导致问题的最后一条语句,因为LINQ使用延迟执行。