2012-04-01 2 views
0

У меня есть следующие модели:Сравнение с кол-во внутреннем подзапроса (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; 

Как это сделать, используя API QueryOver?

+0

Я не вижу ни одной доменной модели; Я вижу только вашу модель базы данных. Чтобы иметь возможность ответить на ваш вопрос, нам нужно будет знать, как выглядят классы. (Рядом с этим, я думаю, ваш SQL-запрос неверен). –

+0

@FrederikGheysels, под редакцией. – eigenein

ответ

0

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

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

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