NHibernate - LINQ查询多对多问题

时间:2012-12-07 20:03:01

标签: c# linq nhibernate nhibernate-mapping

我正在尝试升级现有的应用程序以使用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类,我希望它能做到。我想知道是否有人做过类似的事情,可以建议一种方法来查询或提供有关如何更好地映射这种情况的任何建议。

2 个答案:

答案 0 :(得分:0)

如果没有看到生成的查询,我只能猜测,但请尝试这样做:

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

答案 1 :(得分:0)

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

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

这意味着它只有在设置为非活动状态时才会返回该类别,并且在CategoriesSite表中不存在记录时仍会返回该类别。