NHibernate和操作符重载

本文关键字:重载 操作符 NHibernate | 更新日期: 2023-09-27 18:03:01

public class Version
{
    public byte Major { get; set; }
    public byte Minor { get; set; }
    public short Build { get; set; }
    public int Revision { get; set; }
    private long NumVersion
    {
        //get {}
        //set {}
        //Some logic that make Int64 number that represents this verion
    }
}

假设我希望能够编写像

这样的查询

Where<Product>(t=>t.Version > new Version(1,2,0,0))

在Product表中,我只存储Int64 NumVersion字段,因此Version属性被映射为组件,目前我像Where<Product>(t=>t.Version.NumVersion > new Version(1,2,0,0).NumVersion)一样查询它

在c#中我可以1。重载比较操作符,2。将其隐式强制转换为long,如:

public static implicit operator long(Version v)
{
    return v.NumVersion;
}

这将允许我比较版本对象,但是如何使NHibernate理解这一点并生成正确的SQL ?

NHibernate和操作符重载

不可能。您要么必须在客户端显式地为每个Version组件或过滤器编写比较。

Maybe:

class p
{
    private p() { }
    public static p Version { get { return new p(); } }
    public static Expression<Func<Product, bool>> operator >(p left, Version version)
    {
        return product => product.Version.NumVersion > version.NumVersion;
    }
    ...
}

Where<Product>(p.Version > new Version(1,2,0,0))