2014-10-06 5 views
2

Как я могу выбрать/вывести значения из подзапроса из другой таблицы в мой основной запрос?QueryOver: выберите столбцы из подзапроса

У меня есть NH-модели, как это:

[Serializable] 
public class MyModel 
{ 
    public virtual int Id {get; set;} 
    //more mapped values 
    .... 
    //unmapped values 
    public virtual string ValueFromOtherTable {get;set;} 
} 

И я хочу, чтобы заполнить ValueFromOtherTable с левой присоединиться так:

Select mt.*, ..., ot.ValueFromOtherTable from MyModelTable mt left 
join OtherTable ot ON (somecondition) 

где MyModelTable это таблица отображается в MyModel-класса , Я хочу заполнить ValueFromOtherTable (без NH-mapping), выбирая все значения из mt (чтобы заполнить NH-сопоставленные столбцы), а затем используя OtherTable Я хочу заполнить ValueFromOtherTable.

Я не могу присоединиться к обеим таблицам через QueryOver, поскольку в модели нет прямой корреляции родитель-ребенок, поэтому JoinAlias или JoinQueryOver не будет работать. Мои MainQueryOver запросов MyModelTable.

АЛЬТЕРНАТИВА:

Альтернативой является первым получить все значения из MyModelTable, а затем, используя свойства есть для запроса OtherTable. Однако это приведет к ошибке SELECT N+1 (для каждой модели от MyModel выберите другую таблицу OtherTable ...), а также сделает код очень сложным.

Есть ли способ решить эту проблему или это единственный способ заполнить MyModel, используя описанную альтернативу ?

ответ

2

Один из способов - использовать проекции, подзапрос и DTO. Итак, скажем, у нас есть DTO (почти то же, что и MyModel, но с новым свойством extern ... например Count). Тогда мы можем сделать это следующим образом:

MyModel main = null; 
MyModelDTO dto = null; 

// the main query 
var query = session.QueryOver<MyModel>(() => main); 

// the subquery used for projection 
var subquery = QueryOver.Of<OtherModel>() 
    // select something, e.g. count of the ID 
    .SelectList(selectGroup => selectGroup.SelectCount(o => o.ID)) 
    // some condition 
    // kind of JOIN inside of the subquery 
    .Where(o => o.xxx == main.yyy); // just example 

// now select the properties from main MyModel and one from the subquery 
query.SelectList(sl => sl 
     .SelectSubQuery(subquery) 
     .WithAlias(() => dto.Count) 
     .Select(() => main.ID) 
     .WithAlias(() => dto .ID) 
     .... 
    ); 

// we have to use transformer 
query.TransformUsing(Transformers.AliasToBean<MyModelDTO >()) 

// and we can get a list of DTO 
var list = query.List<MyModelDTO>(); 
+0

Спасибо, это уже приносит мне гораздо ближе к решению. С помощью этого подхода существует способ сделать SELECT * для столбцов из MyModel/основного запроса при выборе только нескольких свойств из OtherModel или мне нужно указать каждый столбец/свойство expliciteley? – Philipp

+0

Нет, либо проекция, либо нет. Нет возможности использовать *, без частичного решения. Извините ... –

+1

ах ладно, я думаю, впереди много работы :) – Philipp