2

NHibernateを使用するように既存のアプリケーションをアップグレードしようとしています。私のデータベースには次のテーブルがあります。

Sites:
- Id (PK)
- Name

Categories:
- Id (PK)
- Name

CategoriesSite
- CategoryId (PK)
- SiteId (PK)
- Active

カテゴリとサイトごとに、CategoriesSiteテーブルにレコードが存在する場合と存在しない場合があります。アイテムがCategoriesSiteテーブルに存在する場合、Activeをfalseに設定することにより、カテゴリーをオフにすることができます。そうでない場合は、Activeがtrueであると見なされます

NHibernateでLINQクエリを作成して、特定のサイト(アクティブな)のカテゴリをフィルタリングしたいと思います。たとえば、次のデータがあるとします。

Sites:
Id | Name
1  | Site 1
2  | Site 2

Categories:
Id | Name
1  | Category 1
2  | Category 2

CategoriesSite:
CategoryId | SiteId | Active
1          | 1      | True
1          | 2      | True
2          | 1      | False

私は言うことができます:

var categories = session.Query<CategorySite>()
                        .Where(s => s.Site.Id == 2 && s.Active)
                        .Select(s => s.Category)
                        .ToList();

ただし、これはカテゴリ1のみを取得し、カテゴリ2は取得しません。誰かが同様のことをして、これを照会する方法を提案したり、このシナリオをより適切にマッピングする方法についての推奨事項を提供したりできるかどうか疑問に思いました。

4

2 に答える 2

0

私はこれを解決したと思います。カテゴリサイトのリストのカテゴリに対して1対多のコレクションを追加しました。これは私が言うことを可能にします:

var categories = session.Query<Category>()
                        .Where(c => !c.Sites.Any(s => s.Site.Id == 2 && !s.Active))
                        .ToList();

つまり、非アクティブに設定されている場合にのみカテゴリが返され、CategoriesSiteテーブルにレコードが存在しない場合でもカテゴリが返されます。

于 2012-12-09T16:31:36.867 に答える
0

生成されたクエリが表示されない場合、推測することしかできませんが、代わりにこれを試してください。

var categories = session.Query<CategorySite>()
                    .Where(s => s.SiteId == 2 && s.Active) // not s.Site.Id
                    .Select(s => s.Category)
                    .ToList();
于 2012-12-07T22:46:35.753 に答える