我是NHibernate的新手,我使用的是v4.0.30319,它似乎甚至没有出现在官方网站上(我不明白为什么?)所以我遇到了麻烦好文档。
我想要的是理论上的简单。我有3张桌子:
所以在表问题中我有疑问,在客户我有客户,在连接表 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
}
答案 0 :(得分:0)
如果您将一个Bag添加到您的Question类链接回ClientAnwsers类,您可以在allQuestions查询中加入ClientAnwsers,就像在上面的SQL查询中一样。
由于我没有真正使用FluentNHibernate,我无法向您展示具体方法。但也许这三个链接有帮助: