NHibernate Group By // Имея выпуск - PullRequest
1 голос
/ 25 июня 2011

Сначала я покажу, что хочу сделать, а потом объясню свою проблему. У меня есть 2 таблицы: «CharItem» и «Attribute», и таблица «ItemAttribute», чтобы связать обе, так как это отношение m: n. Эта таблица также может определять значение для атрибута.

Я хотел найти все элементы, имеющие хотя бы некоторые атрибуты. Запрос sql это:

SELECT  ci.*
FROM     CharItem ci 
INNER JOIN ItemAttribute ia
on ci.CharItemId = ia.CharItemId 
WHERE 
( 
(ia.AttributeId = 48 and ia.ValueX >= 1) 
or (ia.AttributeId = 6) 
) 
GROUP BY ci.CharItemId 
HAVING   count(ia.AttributeId) >= 2

Итак, как вы можете видеть, я хочу найти все элементы, поэтому мой запрос должен верните мне несколько предметов.

Я попытался сделать это, и я думаю, что я почти нашел решение, но Я что-то упустил. Следующим методом я возвращаю товар идентификаторы, но не полный элемент, и я не могу найти, как получить полный элемент: x

  var query = Session 
  .CreateCriteria(typeof(CharItem), "ci") 
  .CreateCriteria("ci.ItemAttribute", "ia", JoinType.InnerJoin); 
  Disjunction disjunction = Restrictions.Disjunction(); 
  foreach (var entry in itemAttribs) 
  { 
    var attribute = entry.Key; 
    var sign = entry.Value.Item1; 
    var value = entry.Value.Item2; 
    var restrictAttrib = Restrictions.Eq("ia.Attribute", attribute); 
    Conjunction conjunction =Restrictions.Conjunction(); 
    conjunction.Add(restrictAttrib); 
    conjunction.Add(Restrictions.Eq("ia.Value", values[j])); 
    disjunction.Add(conjunction); 
  } 
  query.Add(disjunction); 
  query.SetProjection(Projections.ProjectionList() 
    .Add(Projections.GroupProperty("ci.CharItemId"),"CharItemid")); 
  query.Add(Restrictions.Ge(Projections.Count("ia.Attribute"), itemAttribs.Count)); 
} 
var charItems = query.List<CharItem>();

Спасибо за вашу помощь.

Решено! Проверьте ответы, чтобы узнать, как это сделать.

1 Ответ

1 голос
/ 25 июня 2011

Когда вы используете проекции, NHibernate будет возвращать только свойства, указанные в проекции. Вот почему вы получаете только идентификаторы в вышеуказанном случае. Если вам нужны все остальные атрибуты элемента, вам необходимо явно добавить их в список проекций.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...