IQueryable与不同的记录和有序

时间:2017-09-26 16:22:39

标签: c# linq

我一直在尝试使用不同且有序的值来获取IQueryable,但我发现在orderby之后我无法应用不同的值,否则我将丢失订单。< / p>

我尝试的最后一个查询如下:

IQueryable<gbd_Pages> Listpagespages = 
      (from c in _db.gbd_Content
       where c.IsActive == true && c.IsDeleted == false && 
             c.gbd_Template_Fields.SortOrder == sortOrder
       orderby c.Content ascending
       select c.gbd_Pages);

有了这个,我得到了重复的结果。

我要返回的表是gbd_Pages,其与gbd_Content的关系为1到多。 这意味着gbd_Content将拥有一个主键为gbd_Pages的外键。

我需要通过表gbd_Template_Fields执行sortOrder,它与gbd_Content具有1对1的关系。

我有办法做到这一点吗?我需要它是IQueryable而不转换为IEnumerable或列表。

3 个答案:

答案 0 :(得分:2)

我相信你需要的是这样的东西:

var query =
    from p in _db.gbd_Pages
    from pc in (from c in p.gbd_Content
               where c.IsActive == true && c.IsDeleted == false &&
                     c.gbd_Template_Fields.SortOrder == sortOrder
               orderby c.Content ascending
               select c).Take(1)
    orderby pc.Content ascending
    select p;

因此,您从关系的one侧开始(以避免需要Distinct),然后从many方面选择记录匹配条件并使用较小的排序字段值(使用有序子查询+ Take(1)),最后使用该单个子记录中的排序字段值对结果进行排序。

我假设你有从gbd_Pagesgbd_Content的逆集合导航属性。如果不这样做,请将p.gbd_Content替换为_db.gbd_Content where c.[gbd_Content_FK] == p.[PK]

答案 1 :(得分:1)

您的主要from必须是gbd_Pages表,而不是gbp_Content,如果这些是您要返回的结果。我必须在这里假设一个外键,但你想改成类似的东西;

IQueryable<gbd_Pages> Listpagespages = _db.gbp_Pages
                                          .Where(p => (from c in _db.gbd_Content
                                                                       where c.IsActive == true 
                                                                          && c.IsDeleted == false 
                                                                       select c.gbd_Pages.PrimaryKeyID)
                                                                      .Any())
                                          .Select(p => new 
                                                  {
                                                      // select specific fields here...
                                                      p,
                                                      SortCol = _db.gbp_Content
                                                                   .FirstOrDefault(c => c.PrimaryKeyID)
                                                                   .Where(c => c.IsActive == true && c.IsDeleted == false &&
                                                                          c.gbd_Template_Fields.SortOrder == sortOrder)
                                                                   .Select(c => c.Content)
                                                  })
                                          .OrderBy(v => c.SortCol);

答案 2 :(得分:-2)

试试这个:

          IQueryable<gbd_Pages> Listpagespages = _db.gbd_Content
                                                .Select (c=>new { c.gbd_Pages })
                                                .Where(c=>c.IsActive == true && c.IsDeleted == false &&c.gbd_Template_Fields.SortOrder == sortOrder)
                                                .Distinct()
                                                .OrderBy(c => c.Content)
                                                .Select(c => c.gbd_Pages)