我有以下域模型:
public class Name { private readonly string fullName; public Name(string fullName) { this.fullName = fullName } public string FullName { get { return fullName; } } public string FirstName { get { /* ... */ } } public string MiddleNames { get { /* ... */ } } public string LastName { get { /* ... */ } } public static implicit operator Name(string name) { /* ... */ } } public class Person { public Name BirthName { get; set; } public Name Pseudonym { get; set; } }
我实现了IUserType,因此我可以将每个名称映射到具有全名的单个数据库列.
像这样的查询工作:
var people = session.QueryOver<Person>() .Where(p => p.Name == "John Doe") .List();
但是我不能这样查询:
var people = session.QueryOver<Person>() .Where(p => p.Name.LastName == "Doe") .List();
我可以让NHibernate使用它吗?
解决方法
我不是一个nhibernate用户,但分析我们在这里有关该场景的所有信息,我有一种强烈的感觉,答案是你不能.
您正在将该类中包含的值映射到db中的单个值.
为了允许查询它的部分,它必须理解Name类中的所有子信息如何与完整值相关.
更新1:
以上答案是关于为您自动生成所有内容并使用您在那里提到的确切查询.
你绝对可以解决像@cs建议的问题.也就是说,定义一个用户定义的函数,它可以完成您想要的任务,并在nHibernate中进行映射.
至少,你可以做以下事情:
session.QueryOver<Person>() .Where(p => session.PersonLastName(p) == "Doe") .List();
另一种方法是定义一个转换为你想要的扩展方法,像本文中那样实现它:http://fabiomaulo.blogspot.com/2010/07/nhibernate-linq-provider-extension.html
那么用法就像:
session.QueryOver<Person>() .Where(p=> p.Name.LastNameExt() == "Doe")// Ext just to avoid name collision .List();
最后,我不确定是否可以将子属性映射到每个用户定义的函数,以便您的查询可以保持不变,如:
session.QueryOver<Person>() .Where(p => p.Name.LastName == "Doe") .List();
并非在所有情况下,您都在从连接数据转换为解析数据.你是唯一一个知道这是否真的为你买东西,而不是单独保留房产的人.