LINQ(到实体)查询排序和分组

时间:2014-08-21 05:54:10

标签: c# linq entity-framework linq-to-entities

我似乎需要一个LINQ(针对MS SQL Server的实体)查询,这有点过头了。

我的架构如下所示:

Database Schema Diagram

我的任务是显示特定ProductPricing的所有ProductItem行,按ProductPricing.EffectiveDate排序,并按ProductPricing.CompaniesId分组。

此外,我需要按ProductItemCompanies.SortOrder订购论坛。

请注意,ProductPricing.CompaniesId可以是null,并且ProductPricing CompaniesId所有null行需要被归为一个放置的单个组在所有其他团体之前。

我做了很多尝试,但我不清楚LINQ加入或分组以使其正确。我当前的代码看起来像这样,但它既不正确也不编译。

(请注意,DefaultProductItemProductItems我正在显示的ProductPricing。)

var vendors = from pp in this.DefaultProductItem.ProductPricings
              orderby pp.EffectiveDate
              join pic in this.DefaultProductItem.ProductItemCompanies on pic.CompanyId equals pp.CompanyId &&
                  pic.ProductItemId equals this.DefaultProductItem.Id
              group pp by pp into v
              select v;

更新

在Tim.Tang的帮助下,我运行了以下查询:

var vendors = from pp in DefaultProductItem.ProductPricings
              join pic in DefaultProductItem.ProductItemCompanies
              on pp.CompanyId equals pic.CompanyId into left
              from pic in left.DefaultIfEmpty()
              orderby pp.EffectiveDate descending, pic == null ? -1 : pic.SortOrder
              group pp by pp.CompanyId into v
              select v;

这已经接近了,但它没有按ProductItemCompanies.SortOrder对结果组进行排序。虽然上面的查询确实按此值排序,但这似乎不会影响组。

我知道我可以在事实之后轻松地对组进行排序,但我希望将原始查询的那部分用于提高效率。

1 个答案:

答案 0 :(得分:1)

这是我的建议,希望它可以提供帮助:

var vendors = from pp in this.DefaultProductItem.ProductPricings
              join pic in this.DefaultProductItem.ProductItemCompanies.Where(x=>x.ProductItemId == this.DefaultProductItem.Id)
              on pp.CompanyId equals pic.CompanyIdinto left
              from pic in left.DefalutIfEmpty()
              orderby pp.EffectiveDate, pic==null?0:pic.SortOrder  //sort order is INT?
              group pp by pp.CompaniesId into v
              select v;