Свойство сопоставления NHibernate помимо запросов LINQ

мое приложение имеет следующую сущность:

public class User
{
    public virtual int UserID { get; set; }
    public virtual Membership LatestMembership { get { return Membership.First(); } }
    public virtual IList<Membership> Membership { get; set; }

    public User()
    {
        Membership = new List<Membership>();
    }
}

Со следующим отображением:

public UserMap()
{
    Table("Users");
    Id(x => x.UserID);
    HasMany(x => x.Membership)
        .KeyColumn("UserID")
        .OrderBy("DateAdded DESC")
        .Inverse()
        .Cascade.All();
}

Свойство LatestMembership для пользователя просто берет первую запись из коллекции членства (которая упорядочена так, чтобы новые записи были вверху).

Пока все хорошо, но теперь скажу, что я хочу сделать следующее (я знаю, что это вернет их все, но я просто использую это в качестве примера):

var users = session.Linq<User>()
    .Where(u => u.LatestMembership.DateAdded < DateTime.UtcNow);

Выдается ошибка, поскольку свойство LatestMembership выходит за рамки возможностей поставщиков nhibernate linq. Единственное решение, которое у меня есть до сих пор, - это преобразовать его в список, а затем применить условие where, но я предполагаю, что это может стать довольно недостаточным для большой базы данных.

Мне было интересно, есть ли альтернативный способ сопоставить это или каковы ваши рекомендации. Спасибо


person nfplee    schedule 17.09.2010    source источник


Ответы (1)


К сожалению, при использовании текущего провайдера Linq это невозможно. Одна вещь, которую вы можете сделать, - это сопоставить свойства объекта LatestMembership, который вы хотите запрашивать, как доступное только для чтения, и использовать формулы в своих сопоставлениях, чтобы получить для него значения. Вы можете увидеть некоторые дополнительные сведения в моем ответе на этот пост.

Другое возможное решение - атаковать это с Membership стороны вещей; запросить последнее членство, соответствующее данному пользователю, и соответствующим образом отфильтровать.

person DanP    schedule 17.09.2010
comment
Привет, в прошлом я использовал формулы для сопоставления со строкой, bool или int, но сопоставление с объектом членства мне не по силам. Я действительно думал о том, чтобы атаковать это со стороны членства, но запрос становится немного сложнее. Скажите, если я попробую: var users = session.Linq ‹Membership› () .Where (m = ›m.DateAdded‹ DateTime.UtcNow) .Select (m = ›m.User) .Distinct (). По сути, он захватывает все фильтры членства, а затем делает отдельные, чтобы получить уникальных пользователей. Проблема в том, что он не запрашивает последнее членство для пользователя, и я не вижу, как это сделать. - person nfplee; 18.09.2010
comment
Вы не сможете отобразить фактический объект членства с помощью формулы; но вы потенциально можете сопоставить его свойства, которые хотите запросить, используя один ... - person DanP; 18.09.2010
comment
Ура, мне не очень нравится этот подход, так что мне, вероятно, придется пока продолжать делать то, что я делаю. - person nfplee; 19.09.2010