1

私は3つのテーブルを持っています

  • プロジェクト テーブル
  • 製品表
  • 更新テーブル

製品テーブルにはプロジェクトのさまざまな製品が保持され、更新テーブルにはさまざまな製品に対して行われた更新が保持され、更新を行ったユーザーへの参照が保持されます。

基本的に私が欲しいのは、現在ログインしているユーザーによって最後に更新された日付で並べ替えられたすべての製品を返すクエリを持つことです (プロジェクトへの製品は多対 1 の関係であるため)。

これは私の現在のクエリです:

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 に答える