首先是一些代码(为问题的目的而简化):
实体:
[View( "SupplierSearchViewView", 1 )]
public class SupplierSearchViewView : IViewDefinition
{
public int SupplierId { get; set; }
public int SkillId { get; set; }
public Nullable<int> DocumentTypeId { get; set; }
public Nullable<int> MainContactId { get; set; }
public int SourceLanguageId { get; set; }
public int TargetLanguageId { get; set; }
public int TaskId { get; set; }
public Nullable<int> SectorId { get; set; }
public Nullable<int> DisciplineId { get; set; }
public Nullable<decimal> Price { get; set; }
public Nullable<int> SkillLevelId { get; set; }
}
Linq查询:
public IQueryable<SupplierSearchViewView> GetQuery( SupplierSearchCriteria sc, int? supplierId = null )
{
return this.supplierSearchViewViewRepository.GetManyNoTracking(
x => new int[] { 84 }.Contains( x.SourceLanguageId )
&&
new int[] { 2 }.Contains( x.TargetLanguageId )
&&
new int[] { 35, 36 }.Contains( x.TaskId )
&&
x.SkillLevelId.HasValue && new int[] { 2, 3 }.Contains( x.SkillLevelId.Value )
);
}
(当然原始方法使用sc对象 - 但是为了测试/演示目的,这个被简化为硬编码值)
此查询返回495总计数与14个唯一供应商(这是正确的)
现在是Group By thing ......
var query = GetQuery( sc );
var groupedQuery = query.GroupBy( x => x.SupplierId );
var tmp = groupedQuery.OrderBy( x => x.Key ).Skip( skip ).Take( take ).ToList();
当查询完成时,结果如下: 14组(当然是正确的,所有人都有正确的ID) 但是...这些小组充满了他们应该少得多的项目(编辑:基本上每个小组都有一些缺失的元素)
但是......如果我在这一行中做了一个小技巧:
var groupedQuery = query.ToList().GroupBy( x => x.SupplierId );
结果是......正确。
当我使用类似的SQL时,也在数据库中:
select x.SupplierId, count(*) from
(
select distinct *
from SupplierSearchViewView ssvv
where ssvv.TaskId in (35,36)
and ssvv.SourceLanguageId = 84
and ssvv.SkillLevelId in (2,3)
and ssvv.TargetLanguageId = 2
) x
group by x.SupplierId
我得到的结果与第二种情况一样(带有“早期ToList()”的结果)
我真的很感激任何想法。