Свойство NHibernate Mapping за пределами запросов LINQ - PullRequest
0 голосов
/ 17 сентября 2010

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

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 для пользователя просто получает первую запись из коллекции Membership (котораяупорядочено так, чтобы новые записи находились вверху).

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

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

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

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

1 Ответ

1 голос
/ 17 сентября 2010

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

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

...