Сравнение с количеством во внутреннем подзапросе (NHibernate QueryOver API)

У меня есть следующая модель:

create table Products (
    Id UNIQUEIDENTIFIER not null,
   Name NVARCHAR(255) null,
   CategoryId UNIQUEIDENTIFIER not null,
   primary key (Id),
  unique (Name, CategoryId)
)

create table Rates (
    Id UNIQUEIDENTIFIER not null,
   Price NUMERIC(19,5) not null,
   TimeStamp DATETIME not null,
   UserId UNIQUEIDENTIFIER not null,
   ProductId UNIQUEIDENTIFIER not null,
   primary key (Id),
  unique (Price, UserId, ProductId)
)

create table Categories (
    Id UNIQUEIDENTIFIER not null,
   Name NVARCHAR(255) not null unique,
   primary key (Id)
)

EDIT: модель предметной области выглядит следующим образом:

public class Category
{
    public string Name { get; set; }
    public IList<Product> Products { get; set; }
    public Guid Id { get; set; }
}

public class Product
{
    public string Name { get; set; }
    public Category Category { get; set; }
    public IList<Rate> Rates { get; set; }
    public Guid Id { get; set; }
}

public class Rate
{
    public User User { get; set; }
    public Product Product { get; set; }
    public decimal Price { get; set; }
    public DateTime TimeStamp { get; set; }
    public Guid Id { get; set; }
}

Что я хочу сделать, так это выбрать все категории, которые не имеют связанных продуктов с соответствующими тарифами. т.е. в SQL это будет выглядеть так:

select * from Categories category where
    (select count(*)
     from Products product 
     inner join Rates rate on rate.ProductId = product.Id 
     where product.CategoryId = category.Id) = 0;

Как я могу сделать это с помощью QueryOver API?


person eigenein    schedule 01.04.2012    source источник
comment
Я не вижу никакой предметной области; Я вижу только вашу модель базы данных. Чтобы ответить на ваш вопрос, нам нужно знать, как выглядят классы. (Кроме того, я думаю, что ваш SQL-запрос неверен).   -  person Frederik Gheysels    schedule 01.04.2012


Ответы (2)


Я не могу проверить сгенерированный sql, но вы можете попробовать это, может быть, это поможет:

Product product = null;
Rate rate = null;

_session.QueryOver<Category>()
  .JoinAlias(category => category.Products, () => product)
  .JoinAlias(() => product.Rate, () => rate)
  .Where(Restrictions.Eq(Projections.Count(() => product.Id), 0)
  .List<Category>();
person Anton    schedule 02.04.2012

Решение найдено:

Category categoryAlias = null;
session.QueryOver<Category>(() => categoryAlias)
    .WithSubquery
    .WhereNotExists(QueryOver.Of<Product>()
        .Where(product => product.Category.Id == categoryAlias.Id)
        .JoinQueryOver<Rate>(product => product.Rates)
        .Select(product => product.Category))
    .List<Category>();

Благодаря https://stackoverflow.com/a/5196609/359730.

person eigenein    schedule 02.04.2012