2009-11-22 5 views
0

J'ai la cartographie NHibernate suivanteComment vérifier un ensemble vide dans LINQ to NHibernate requête

<class name="Customer"> 
    <id name="Id"> 
    <generator class="native"/> 
    </id> 
    <property name="Name"/> 
    <set name="Invoices" cascade="all" lazy="false"> 
    <key column="CustomerId"/> 
    <one-to-many class="Invoice"/> 
    </set> 
</class> 

<class name="Invoice"> 
    <id name="Id"> 
    <generator class="native"/> 
    </id> 
    <property name="Status"/> 
</class> 

Avec ces données objets

public enum InvoiceStatus { Unpayed, Payed }; 

public class Customer 
{ 
    virtual public int Id { get; private set; } 
    virtual public string Name { get; set; } 
    virtual public ISet<Invoice> Invoices { get; set; } 
} 

public class Invoice 
{ 
    virtual public int Id { get; private set; } 
    virtual public InvoiceStatus Status { get; set; } 
} 

Quand je lance le code suivant

t = session.BeginTransaction(); 
session.SaveOrUpdate(new Customer 
{ 
    Name = "Customer1", 
    Invoices = new HashedSet<Invoice> { new Invoice { Status = InvoiceStatus.Payed } } 
}); 
session.SaveOrUpdate(new Customer 
{ 
Name = "Customer2", 
    Invoices = new HashedSet<Invoice> { new Invoice { Status = InvoiceStatus.Unpayed } } 
    }); 
session.SaveOrUpdate(new Customer 
{ 
    Name = "Customer3", 
    Invoices = new HashedSet<Invoice> { 
     new Invoice {Status = InvoiceStatus.Payed}, 
     new Invoice {Status = InvoiceStatus.Unpayed} 
    } 
}); 
session.SaveOrUpdate(new Customer { Name = "Customer4" }); 
t.Commit(); 

Console.WriteLine("{0} customers have payed invoices", session.Linq<Customer>().Where(c => c.Invoices.Any(i => i.Status == InvoiceStatus.Payed)).ToList().Count); 
Console.WriteLine("{0} customers have unpayed invoices", session.Linq<Customer>().Where(c => c.Invoices.Any(i => i.Status == InvoiceStatus.Unpayed)).ToList().Count); 
Console.WriteLine("Attempt 1: {0} customers have no invoices", session.Linq<Customer>().Where(c => c.Invoices.IsEmpty).ToList().Count); 
Console.WriteLine("Attempt 2: {0} customers have no invoices", session.Linq<Customer>().Where(c => c.Invoices.Count == 0).ToList().Count); 
Console.WriteLine("Attempt 3: {0} customers have no invoices", session.Linq<Customer>().Where(c => c.Invoices.Count() == 0).ToList().Count); 

Je reçois

2 customers have payed invoices 
2 customers have unpayed invoices 
Attempt 1: 4 customers have no invoices 
Attempt 2: 3 customers have no invoices 
Attempt 3: 3 customers have no invoices 

Les trois derniers résultats ne sont pas ce que j'attendais, pouvez-vous expliquer pourquoi?
Et comment pourrais-je obtenir les bons résultats?

Répondre

0

Pour répondre à ma propre question. Cela fonctionne quand j'utilise! C.Invoices.Any() dans la clause Where

Console.WriteLine("Attempt 4: {0} customers have no invoices", session.Linq<Customer>().Where(c => !c.Invoices.Any()).ToList().Count);