我一直在尝试使用不同且有序的值来获取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
或列表。
答案 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_Pages
到gbd_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)