【发布时间】:2014-12-15 11:00:01
【问题描述】:
按条件列选择实体,并通过多对多条件明确
我遵循了类(实体)的结构:
class Order {
...
public virtual long OrderId {get; set;}
public virtual boolean ForFavorites {get; set;}
public virtual User Owner {get; set;}
...
}
class User {
...
public virtual long UserId { get; set; }
public virtual List<User> Favorites {get; set;}
public virtual List<User> FavoritesOrderers {get; set;}
...
}
如何编写QueryOver 或获取所有订单的条件:
- 订单未标记为
ForFavoritesAND - 订单被标记为
ForFavorites并且一些用户在Order.Owner.Favorites 中?
相反的方式:
如何写QueryOver 或Criteria 来选择我收藏夹中Order.Owner 的所有订单?
--更新:添加 Fluent 映射
我的映射:
class OrderMap:ClassMap<Order> {
public OrderMap(){
Id(x=>x.OrderId).GeneratedBy.Identity();
Map(x => x.ForFavorites);
References(x => x.Owner, "UserId");
...
}
}
class UserMap:ClassMap<User> {
public UserMap() {
Id(x => x.UserId).GeneratedBy.Assigned();
HasManyToMany(x => x.Favorites)
.AsBag()
.LazyLoad()
.Table("Favorites")
.ParentKeyColumn("UserId")
.ChildKeyColumn("FavoriteId")
.Cascade.All();
HasManyToMany(x => x.FavoritesOrderers)
.AsBag()
.LazyLoad()
.Table("FavoriteOrderers")
.ParentKeyColumn("UserId")
.ChildKeyColumn("FavoriteId")
.Cascade.All();
...
}
}
--update:添加一些SQL
SQL 可能是这样的:
:userId是收藏用户的id
SELECT *
FROM [Order] o
JOIN [User] u ON o.owner = u.userId
WHERE (
(o.ForFavorites = false) ||
(o.ForFavorites = true && :userId IN
(SELECT favoriteId FROM [Favorites] f WHERE (f.UserId = u.userId))
))
还有其他性能更好的变体吗?..
相反的方式:
SELECT *
FROM [Order] o
JOIN [User] u ON o.owner = u.userId
INNER JOIN [FavoriteOrderers] fo ON fo.favoriteId=u.userId
WHERE (fo.userId = :userId)
【问题讨论】:
-
你能展示一下你想生成的SQL吗?
-
我正在编辑帖子。
标签: nhibernate many-to-many criteria queryover