爲了更容易解釋我的問題,我將創建以下虛構示例,說明非常基本的多對多關係。 A 汽車可以有很多零件和零件可以屬於很多汽車。Nhibernate QueryOver - 執行所有的多對多關係
DB模式:
CAR_TABLE
---------
CarId
ModelName
CAR_PARTS_TABLE
---------------
CarId
PartId
PARTS_TABLE
-----------
PartId
PartName
課堂:
public class Car
{
public int CarId {get;set;}
public string Name {get;set;}
public IEnumerable<Part> Parts {get;set;}
}
public class Part
{
public int PartId {get;set;}
public string Name {get;set}
}
使用這個非常簡單的模型,我想獲得具有從列表中分配給它們的所有部件的任何汽車我正在尋找的零件。
所以說我有PartIds數組:
var partIds = new [] { 1, 3, 10};
我想模仿下面的C#代碼數據庫調用方面:
var allCars = /* code to retrieve all cars */
var results = new List<Car>();
foreach (var car in allCars)
{
var containsAllParts = true;
foreach (var carPart in car.Parts)
{
if (false == partIds.Contains(carPart.PartId))
{
containsAllParts = false;
break;
}
}
if (containsAllParts)
{
results.Add(car);
}
}
return results;
要明確:我想從partIds數組中指定具有所有部件的汽車。
我有以下查詢,它是真正低效的,因爲它爲partIds數組中的每個id創建一個子查詢,然後對它們的每個結果執行IsIn查詢。我迫切希望找到更有效的方式來執行這個查詢。
Car carAlias = null;
Part partAlias = null;
var searchCriteria = session.QueryOver<Car>(() => carAlias);
foreach (var partId in partIds)
{
var carsWithPartCriteria = QueryOver.Of<Car>(() => carAlias)
.JoinAlias(() => carAlias.Parts,() => partAlias)
.Where(() => partAlias.PartId == partId)
.Select(Projections.Distinct(Projections.Id()));
searchCriteria = searchCriteria
.And(Subqueries.WhereProperty(() => carAlias.Id).In(carsWithPartCriteria));
}
var results = searchCriteria.List<Car>();
是否有一個體面的方式來執行這種查詢使用NHibernate?
非常巧妙地將查詢路徑反轉爲從零件的上下文開始。 :)我會試試這個,讓你知道。謝謝。 – ctrlplusb 2012-08-08 08:20:48
更高效地完美和方式。 X – ctrlplusb 2012-08-10 14:25:29