我有3个表
- 项目表
- 产品表
- 更新表
产品表保存项目中的不同产品,更新表保存对各种产品的更新,并保存对用户的引用。
基本上,我想要的是有一个查询,返回所有产品(因为产品到项目是一个多对一的关系),按当前登录的用户上次更新的日期排序。
这是我当前的查询:
IEnumerable<ProjectProduct> list =
from joined in
(from product in db.GetTable<Product>()
join project in db.GetTable<Project>()
on product.ProjectId equals project.ID
select new { product, project })
join projectupd in db.GetTable<ProjectUpdate>()
on joined.product.ID equals projectupd.ProductID
where projectupd.CreatedBy == ParamUser
orderby projectupd.LastUpdate
select new ProjectProduct(joined.project, joined.product);
然而,我得到的结果只是更新表中的条目,而不是所有现有的产品。我知道"where"子句使它只选择特定用户创建的更新,所以我走在了正确的轨道上,但我尝试了一些方法来使查询成功,但没有成功。
有人对如何达到预期结果有什么建议吗?
这里有一个有点冗长的答案,它使用了方法链语法,但我确实认为它符合您的要求:
var products = db.GetTable<Product>();
var projects = db.GetTable<Project>();
var projectUpdates = db.GetTable<ProjectUpdate>();
var latestProjectUpdatesForUser = projectUpdates
.Where(x => x.CreatedBy == paramUser)
.GroupBy(x => x.ProductId)
.Select(g => g.OrderByDescending(x => x.LastUpdate).First());
var list = products
.Join(
projects,
product => product.ProjectId,
project => project.Id,
(product, project) => new
{
Product = product,
Project = project,
Update = latestProjectUpdatesForUser.FirstOrDefault(u => u.ProductId == product.Id)
}
)
.OrderByDescending(x => x.Update != null ? (DateTime?)x.Update.LastUpdate : null)
.ThenBy(x => x.Project.Id)
.ThenBy(x => x.Product.Id)
.Select(x => new ProjectProduct { Project = x.Project, Product = x.Product});
它利用了DateTime?
是可排序的,并且在使用OrderByDescending
时null
值最后一个的事实。