LINQ IQueryable GroupBy给出了错误的结果

时间:2015-06-26 13:48:11

标签: c# sql linq group-by iqueryable

首先是一些代码(为问题的目的而简化):

实体:

[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()”的结果)

我真的很感激任何想法。

0 个答案:

没有答案