我的主要实体叫做[合同]。合同与[服务]有很多关系。
当我查询合同列表时,我会抓住第一个服务,如下所示:
IQueryable<Contract> q = ctx.Contracts.Skip(startRow - 1).Take(pgSize);
q.Select(c =>
new ContractSearchResult()
{
ContractID = c.ContractID,
FirstService = c.Contract2Service.FirstOrDefault().Service.Name,
ServiceCount = c.Contract2Service.Count,
}
).ToList();
(当我显示此列表时,如果只有1,则显示FirstService。如果&gt; 1我显示“My1stService(3)”以显示我看到3个服务中的第1个)这样可以正常工作。
我的问题是:
有没有办法按FirstService排序?或者这不可能吗?我还没有找到一种在linq中表达这种情况并允许分页的方法。
任何帮助都将不胜感激。
答案 0 :(得分:2)
您需要在分页前订购。
var result = ctx.Contracts
.Select(c =>
new ContractSearchResult()
{
ContractID = c.ContractID,
FirstService = c.Contract2Service.FirstOrDefault().Service.Name,
ServiceCount = c.Contract2Service.Count,
})
.OrderBy(x => x.FirstService)
.Skip(startRow - 1)
.Take(pgSize)
.ToList();
另请注意,FirstOrDefault
可以返回null
,您应该检查一下。如果您知道它将(或应该)永远不会null
,那么请改用First
。
答案 1 :(得分:1)
q.OrderBy(c => c.Contract2Service.FirstOrDefault().Service.Name)
.Select(c =>
new ContractSearchResult()
{
ContractID = c.ContractID,
FirstService = c.Contract2Service.FirstOrDefault().Service.Name,
ServiceCount = c.Contract2Service.Count,
}
)
.ToList();
除非我在您的问题中遗漏了某些内容(可能),否则应该在致电OrderBy()
Select()
一样简单