【问题标题】:Fluent NHibernate filter child collection with Linq流利的 NHibernate 过滤器子集合与 Linq
【发布时间】:2012-10-05 11:34:26
【问题描述】:

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

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 查询来实现?

【问题讨论】:

  • 如果可以的话,可以用 QueryOver 来完成。

标签: linq nhibernate fluent-nhibernate


【解决方案1】:

您需要日期条件出现在连接的 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();

【讨论】:

    【解决方案2】:

    无法使用 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/

    【讨论】:

    • 谢谢,但这对我不起作用,因为 Order 对象没有 Shop 属性。
    • 它有 ShopId 吗?如果您正在映射一个方向,为什么不映射另一个方向,为了不直接分配 Id,您必须分配 shop 实例。
    • 你在第二个查询中做什么?看起来它正在寻找除了我真正需要的商店之外的所有商店...我正在尝试检索一个给定的商店,其订单位于特定日期之间
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-02
    相关资源
    最近更新 更多