Сравнение с количеством во внутреннем подзапросе (NHibernate QueryOver API) - PullRequest
0 голосов
/ 01 апреля 2012

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

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)
)

РЕДАКТИРОВАТЬ : модель домена выглядит следующим образом:

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;

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

Ответы [ 2 ]

0 голосов
/ 02 апреля 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.

0 голосов
/ 02 апреля 2012

Я не могу проверить сгенерированный 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>();
...