2016-08-19 8 views
0

очень начинающий вопрос:NHibernate Соединение слева

У меня есть два класса, обзор и ReviewSentences:

public class Review 
{ 
    public virtual int recordId { get; set; } 
    public virtual string reviewerId { get; set; } 
    public virtual string reviewerName { get; set; } 
    public virtual string country { get; set; } 
    public virtual string zipCode { get; set; } 
    public virtual string reviewProduct { get; set; } 
    public virtual string reviewText { get; set; } 
    public virtual string reviewTextLanguage { get; set; } 
    public virtual double sentimentScore { get; set; } 
    public virtual bool isScoreRefined { get; set; } 
} 

pulic class ReviewSentences 
{ 
    public virtual int recordId { get; set; } 
    public virtual int reviewId { get; set; } 
    public virtual int sentenceId { get; set; } 
    public virtual string sentence { get; set; } 
    public virtual double sentimentScore { get; set; } 
} 

Свойство ReviewSentences.reviewId является внешним ключом со ссылкой на Review.recordId. Один отзыв может иметь много предложений (Обзор: ReviewSentences 1: Many)

Я пытался в течение долгого времени, но не в состоянии воспроизвести следующий запрос с точки зрения NHibernate с session.CreateCriteria:

select * from Reviews r 
left join 
ReviewSentences rs 
on 
r.RecordId = rs.ReviewId 
where rs.ReviewId is null 

Запрос дает мне все отзывы из таблицы Review, в которых нет записей в таблице ReviewSentences.

+0

ORMs не нужно ссылки, вы должны использовать * отношения * между объектами для загрузки дочерних объектов всякий раз, когда вы загружаете родительский объект. Поиск JOIN означает, что есть проблема с отображением –

+0

Спасибо за направление @PanagiotisKanavos. Проблема решена сейчас – Syed

ответ

1

Это вопрос сопоставления. Вы должны включить массив ReviewSentences в свой класс Review и правильно его отобразить.

public class Review 
{ 
    public virtual int recordId { get; set; } 
    public virtual string reviewerId { get; set; } 
    public virtual string reviewerName { get; set; } 
    public virtual string country { get; set; } 
    public virtual string zipCode { get; set; } 
    public virtual string reviewProduct { get; set; } 
    public virtual string reviewText { get; set; } 
    public virtual string reviewTextLanguage { get; set; } 
    public virtual double sentimentScore { get; set; } 
    public virtual bool isScoreRefined { get; set; } 
    public virtual IList<ReviewSentences> sentences { get; set; } 
} 

pulic class ReviewSentences 
{ 
    public virtual int recordId { get; set; } 
    public virtual int reviewId { get; set; } 
    public virtual int sentenceId { get; set; } 
    public virtual string sentence { get; set; } 
    public virtual double sentimentScore { get; set; } 
} 

то в отображении вы должны ссылаться приговоры в качестве ссылки. но вы не сказали, какого рода отображение вашего используя (свободный, конформистом и т.д.)

+0

Спасибо, что дали направление моему вопросу. Это плюс ответ здесь помог мне достичь того, что я хотел: http://stackoverflow.com/questions/29985158/minimal-and-correct-way-to-map-one-to-many-with-nhibernate – Syed

0

Исправлено отображение в hbm.xml файлов и получили необходимые результаты с помощью:

var reviews= session.CreateCriteria<Review>("r") 
       .CreateCriteria("r.sentences", JoinType.LeftOuterJoin) 
       .Add(Restrictions.IsNull("recordId")) 
       .List<Review>(); 
Смежные вопросы