2012-04-11 63 views
2

遇到问题,我希望上次导入的数据显示失败。我结束诉诸HQL,因为我不得不执行两个查询任何人都可以看到为什么这不起作用(正确)在Linq到NHibernate,它是3.1中的已知错误?Get Max row(Linq,NHibernate)

我会写的SQL。

select JobImport.* from 
JobImportResult 
inner join (
    select Max(JobImportResultId) as JobImportResultId 
    from JobImportResult 
    group by JobImportId 
)as tbl on tbl.JobImportResultId = JobImportResult.JobImportResultId 
inner join JobImport on JobImport.JobImportId = JobImportResult.JobImportId 
where ImportFailureReasonId is not null 

HQL我结束了写作。

select jir.JobImport from JobImportResult jir where jir.Id in 
(select max(mjir.Id) from JobImportResult mjir group by mjir.JobImport) 
and jir.ImportFailureReason is not null 

LINQ的的作品(但我认为2000年后行将打破)

var innerQuery = Query<JobImportResult>() 
    .GroupBy(jir=>jir.JobImport) 
    .Select(jir=>jir.Max(jr=>jr.Id)); 

var innerQueryListed = innerQuery.ToList(); 

var resultQuery = Query<JobImportResult>() 
    .Where(jir => innerQueryListed.Contains(jir.Id) && jir.ImportFailureReason != null) 
    .Select(jir => jir.JobImport); 

LINQ的不工作:(

var innerQuery = Query<JobImportResult>() 
.GroupBy(jir=>jir.JobImport) 
.Select(jir=>jir.Max(jr=>jr.Id)); 

var resultQuery = Query<JobImportResult>() 
.Where(jir => innerQuery.Contains(jir.Id) && jir.ImportFailureReason != null) 
.Select(jir => jir.JobImport); 
+0

当你说它在2000行后中断时,错误是什么? – mattytommo 2012-04-11 07:45:20

+0

FYI http://stackoverflow.com/questions/656167/hitting-the-2100-parameter-limit-sql-server-when-using-contains – Mark 2012-04-11 10:43:34

+0

啊我不知道,我知道包含的是DEVIL上性能虽然嘿嘿:) – mattytommo 2012-04-11 10:49:01

回答

3

您使用的.NET 4 ?如果是这样,请试试这个:

var innerQuery = Query<JobImportResult>() 
    .GroupBy(jir=>jir.JobImport) 
    .Select(jir=>jir.Max(jr=>jr.Id)) 
    .ToList(); 

var resultQuery = Query<JobImportResult>() 
    .Where(jir => innerQuery.Any(j => j == jir.Id) 
     && jir.ImportFailureReason != null) 
    .Select(jir => jir.JobImport) 
    .ToList(); //only use this if you want to resolve the query 

或.NET 3.5 ch ange resultQuery部分为:

var resultQuery = Query<JobImportResult>() 
    .Where(jir => innerQuery.Count(j => j == jir.Id) > 0 
     && jir.ImportFailureReason != null) 
    .Select(jir => jir.JobImport) 
    .ToList(); //only use this if you want to resolve the query 
+0

我使用.net 3.5。和解决方案的工作原理!!! .net 4解决方案看起来像它也会有2000个结果限制并执行两个查询 – Mark 2012-04-11 10:11:50

+0

你能解释为什么innerQuery.Count能够工作,但我原来的查询不能吗?(这是一个在NH后期版本中修复的bug /功能) – Mark 2012-04-11 10:13:31

+0

啊,很高兴它可以工作。我认为你原来的查询不起作用,因为你在做ToList之前做了一个Contains,而NHibernate在Queryable上执行Contains时遇到了问题。我在NHibernate中看到了一些使用东西时抛出NotSupportedException的例子像IsNullOrWhiteSpace和类似的东西,bes要做的事情(直到他们修复它)首先解析查询(使用ToList)然后执行你在原始查询中无法实现的逻辑。 – mattytommo 2012-04-11 10:22:44