连接linq中的3个表,从两个表中获取所有条目



我有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?是可排序的,并且在使用OrderByDescendingnull值最后一个的事实。

最新更新