NHibernate 4 Left Outer使用一个数据库查询加入

时间:2014-12-01 22:55:35

标签: nhibernate fluent-nhibernate left-join queryover

我是NHibernate的新手,我使用的是v4.0.30319,它似乎甚至没有出现在官方网站上(我不明白为什么?)所以我遇到了麻烦好文档。

我想要的是理论上的简单。我有3张桌子:

  • 客户端
  • ClientAnswer
  • 问题

所以在表问题中我有疑问,在客户我有客户,在连接表 ClientAnswer 我有一个客户'回答每个问题(如果有的话)。可能是客户尚未回复问题所以它在ClientAnswer中没有一行。

我使用FluentNHibernate进行映射,其内容如下:

public ClientMap()
    {
        Id(x => x.Id);
        Map(x => x.Name).Not.Nullable();
        Map(x => x.Notes).Nullable();
        Map(x => x.IsDeleted).Not.Nullable();
    }


public QuestionMap()
    {
        Id(x => x.Id);
        Map(x => x.Description).Not.Nullable();
        Map(x => x.IsDeleted).Not.Nullable();
    }

public ClientAnswerMap()
    {
        Id(x => x.Id);
        Map(x => x.Value).Not.Nullable();
        Map(x => x.IsDeleted).Not.Nullable();

        References<Client>(x => x.Client, "ClientId");
        References<Driver>(x => x.Question, "QuestionId");
    }

我想实现一个返回CustomThing列表的函数,因此每个CustomThing都会包含一个问题和特定客户端的答案(如果有的话,否则为null)。

IEnumerable<CustomThing> GetQuestionsAndAnswers(int clientId)

像我的自定义对象一样简单

public class CustomThing
{
    public Question Question { get; set; }
    public ClientAnswer ClientAnswer { get; set; } //it could be null
}

在SQL中我可以做类似的事情:

从问题q中选择* 左外连接ClientAnswer ca 在ca.QuestionId = q.Id

然后以某种方式过滤掉ClientId不是我正在寻找的客户端的ClientAnswers,并将结果放入CustomThing的可枚举中。 (我希望我能正确解释)

我对任何建议持开放态度,我对SQL并不擅长:)

谢谢,

编辑:我此刻此刻。但它看起来非常低效并且具有对数据库的多次访问。但是如果它显示了我想要的想法:

public IEnumerable<CustomThing> GetQuestionsAndAnswers(int clientId)
    {
        IList<Question> allQuestions = _session.QueryOver<Question>()
            .WhereNot(x => x.IsDeleted).List();

        IList<CustomThing> customThings= new List<CustomThing>();

        foreach (Question q in allQuestions)
        {
            CustomThing customThing= new CustomThing();
            customThing.Question = q;
            customThing.ClientAnswer= GetClientAnswer(clientId, q.Id);

            customThings.Add(customThing);
        }

        return customThings;
    }

    private ClientAnswer GetClientAnswer(int clientId, int questionId)
    {
        var clientAnswer = _session.QueryOver<ClientAnswer>()
            .Where(x => x.Client.Id == clientId)
            .Where(x => x.Question.Id == questionId)
            .WhereNot(x => x.IsDeleted).SingleOrDefault();

        return clientAnswer; //can be null if the client did not answer this question
    }

1 个答案:

答案 0 :(得分:0)

如果您将一个Bag添加到您的Question类链接回ClientAnwsers类,您可以在allQuestions查询中加入ClientAnwsers,就像在上面的SQL查询中一样。

由于我没有真正使用FluentNHibernate,我无法向您展示具体方法。但也许这三个链接有帮助:

NHibernate Mapping - Set

Fluent mapping - HasMany / one-to-many

NOtherDev: Mapping-by-Code - Set and Bag