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 に答える