2

我正在尝试升级现有应用程序以使用 NHibernate。我的数据库有以下表格:

Sites:
- Id (PK)
- Name

Categories:
- Id (PK)
- Name

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

对于每个类别和站点,CategoriesSite 表中可能存在也可能不存在记录。如果某个项目存在于 CategoriesSite 表中,那么它可以通过将 Active 设置为 false 来关闭 Category。如果不是,则假定 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

没有看到生成的查询,我只能猜测,但是,试试这个:

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 回答
0

我想我已经解决了这个问题。我针对类别站点列表的类别添加了一对多集合。这让我可以说:

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 回答