1

我正在尝试检索根聚合及其子集,对子集应用日期过滤器。

CREATE TABLE Shop
(
    Id int
)

CREATE TABLE Order
(
    ShopId int,
    OrderDate datetime
)

自然,子对象没有 ShopId 属性来避免双向引用:

class Shop
{
    int Id { get; set; }
    List<Order> { get; set; }
}

class Order
{
    DateTime OrderDate { get; set; }
}

FNHB 映射如下所示:

public ShopMap()
{
    this.Table("SHOP");
    this.Id(x => x.Id).Column("ID");
    this.HasMany(x => x.Orders).Table("ORDER").KeyColumn("SHOP_ID");
}

public OrderMap()
{
    this.Table("ORDER");
    this.Map(x => x.OrderDate);
}

我正在尝试检索一个给定的商店,其订单放置在特定日期、给定参数之间shopId, fromDate, toDate,我已经尝试过了,但它抛出了异常:

Session.Query<Shop>().Where(shop => shop.Id == shopId)
.FetchMany(
    shop => shop.Orders.Where(
        order => order .OrderDate >= fromDate && order.OrderDate <= toDate));

这可以在不使用魔术字符串(NHb 标准、HQL 等)的情况下实现吗,最好使用简单的 Linq 查询?

4

2 回答 2

3

您需要日期条件出现在连接的 ON 子句上,而 shopId 的检查应该出现在 WHERE 子句上。试试这个:

Shop shopAlias = null;
Order orderAlias = null;

ICriterion dateCriterion = Restrictions.Where<Order>
    (o => o.OrderDate >= fromDate && o.OrderDate <= toDate);

var query =
    QueryOver.Of(() => shopAlias).Left.JoinAlias(
    () => shopAlias.Orders, () => orderAlias, dateCriterion).Where
    (s => s.Id == shopId);
var result = query.GetExecutableQueryOver(Session).SingleOrDefault();
于 2012-10-05T15:39:32.457 回答
0

无法使用 Query 来解决,但可以使用 QueryOver 来解决:

Shop shopAlias = null;
var existing = QueryOver.Of<Order>()
                        .Where(x => x.OrderDate >= fromDate)
                        .And(x => x.OrderDate <= toDate)
                        .And(x => x.Shop.Id == shopAlias.Id)
                        .Select(x => x.Shop);

result = Session.QueryOver<Shop>(() => shopAlias)
                .Fetch(x => x.Orders).Eager
                .WithSubquery.WhereNotExists(existing)
                .List();

像这样的东西应该工作。

http://www.philliphaydon.com/2011/01/revisiting-exists-in-nhibernate-3-0-and-queryover/

于 2012-10-05T12:43:05.897 回答