2012-04-01 7 views
0

Ich habe folgendes Modell:Vergleich mit Zahl in Innen subquery (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: Das Domain-Modell ist wie folgt:

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; } 
} 

Was ich tun möchte, Wählen Sie alle Kategorien aus, denen keine Produkte mit zugehörigen Preisen zugeordnet sind. I.e. In SQL würde dies wie folgt aussehen:

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; 

Wie kann ich dies mit QueryOver API tun?

+0

Ich sehe kein Domänenmodell; Ich sehe nur dein Datenbankmodell. Um Ihre Frage beantworten zu können, müssen wir wissen, wie die Klassen aussehen. (Außerdem denke ich, dass Ihre SQL-Abfrage falsch ist). –

+0

@ FrederikGheysels, bearbeitet. – eigenein

Antwort

0

Die Lösung gefunden wird:

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

Dank https://stackoverflow.com/a/5196609/359730.

0

Ich kann nicht generiert SQL überprüfen, aber Sie können dies versuchen, es ist vielleicht Hilfe:

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>(); 
Verwandte Themen