2015-11-16 3 views
1

Вот дело, я получил 2 таблицы:проекция недвижимости в подзапросов NHibernate критериев

table (A) with columns (colA_1 | colA_2 | colA_ID) <br> 
table (B) with columns (colB) 

и я использую DetachedCriteria.For<AnyEntity>() для запроса SQL.

Цель получить SQL-senerated как это:

Select A.colA_ID from A 
where (CAST(colA_1 AS VARCHAR(10)) + CAST(colA_2 AS VARCHAR(10))) 
in (select colB from B) 

Заранее спасибо за любую помощь

ответ

0

Я бы настоятельно рекомендовал создать специальное свойство на вашем A лица:

public class EntityA 
{ 
    ... 
    public virtual string ProjectedKey { get; set; } 
} 

И перевести его как только с формулой

<property name="ProjectedKey" 
      formula="(CAST(colA_1 AS VARCHAR(10)) + CAST(colA_2 AS VARCHAR(10)))" 
      insert="false" update="false" /> 

И теперь легко использовать подзапрос

// subquery to get colB (its id?) from table B 
var detachedQuery = DetachedCriteria.For<EntityB>()  
    .SetProjection(Projections.Id()) // or property representing col B 

// use subquery with property represented by formula 
var rootQuery = session.CreateCriteria<EntityA>() 
    .Add(Subqueries.PropertyIn("ProjectedKey", detachedQuery)); 
+0

Благодаря Радим, решение работает для простой задачи я в курсе, но реальная проблема является более сложной, чем я написал. Я пытался адаптировать это к своей ситуации, но я не добираюсь туда. Представьте, что в (CAST (colA_1 AS VARCHAR (10)) + CAST (colA_2 AS VARCHAR (10))) Я не хочу colA_2, но я хочу colC_2 из таблицы C. Это потому, что у меня есть составной ключ в EntityA, поскольку вы определенная в вашем решении –

+0

Это слишком сложно. Такие сценарии превышают возможности инструментов ORM. Он не предназначен для решения NON стандартных ключей. Даже с точки зрения БД такие запросы являются наиболее неэффективными. Я хочу, чтобы вы могли предоставить вам общее решение с NHibernate здесь ... но единственный способ - исправить дизайн БД. Шутки в сторону. Вы можете сделать это сейчас или позже, но мой опыт говорит: нет другого пути ... извините. Удачи с NHibernate во всяком случае;) –

+0

Еще раз спасибо Radim, мне удалось использовать параметр формулы для достижения того, что я хочу, например здесь [http://stackoverflow.com/questions/13114619/using-a-property-mapping-with-a -formula-in-nhibernate] (http://stackoverflow.com/questions/13114619/using-a-property-mapping-with-a-formula-in-nhibernate), но недостатком является смешивание чистого sql, который сломается преимущество целостности между моделью C# и БД. –