c# – 我可以使用映射到单个列的多个属性查询UserType吗?

我有以下域模型:
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类中的所有子信息如何与完整值相关.

这意味着要了解你所拥有的自定义c#代码.

更新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();

并非在所有情况下,您都在从连接数据转换为解析数据.你是唯一一个知道这是否真的为你买东西,而不是单独保留房产的人.

相关文章

C#项目进行IIS部署过程中报错及其一般解决方案_c#iis执行语句...
微信扫码登录PC端网站应用的案例(C#)_c# 微信扫码登录
原文地址:http://msdn.microsoft.com/en-us/magazine/cc163...
前言 随着近些年微服务的流行,有越来越多的开发者和团队所采...
最近因为比较忙,好久没有写博客了,这篇主要给大家分享一下...
在多核CPU在今天和不久的将来,计算机将拥有更多的内核,Mic...