NHibernate и перегрузка оператора - PullRequest
8 голосов
/ 22 июля 2011
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?

Ответы [ 2 ]

1 голос
/ 27 июля 2011

Может быть:

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))
1 голос
/ 26 июля 2011

невозможно.Вам придется либо явно писать сравнения для каждого Version компонента, либо фильтровать на стороне клиента.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...