1

我有 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”子句使它只选择由特定用户创建的更新,所以我走在正确的轨道上,但我尝试了一些方法来使查询成功,但没有运气。

有人对如何获得所需结果有建议吗?

4

1 回答 1

1

这是一个有点冗长的答案,它使用方法链语法,但我确实认为它可以满足您的需求:

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?可排序的事实,并且null在使用OrderByDescending.

于 2012-08-23T11:57:52.657 回答