2016-06-02 13 views
1

Ich benutze NHibernet 3.1 für .Net und ich habe dieses Szenario.NHibernate Filter basiert auf einer Liste <T>

ClassA.cs

public class ClassA 
{ 
    public virtual string ID_1 { get; set; } 
    public virtual string ID_2 { get; set; } 

    public virtual string Nome { get; set; } 
} 

ClassA.hbm.xml

<class name="ClassA" table="TableA" lazy="false"> 
    <composite-id> 
     <key-property name="ID_1" column="ID_1" /> 
     <key-property name="ID_2" column="ID_2" /> 
    </composite-id> 

    <property name="Nome"> 
     <column name="Nome" sql-type="varchar" not-null="false" /> 
    </property> 
    </class> 

Ich habe eine Liste List<ClassA> und ich brauche auf dieser Liste TableA zu filtern, wie könnte ich tun Das ?

 
List ClassA 
| 1 | 1 | Teste1 | 
| 2 | 3 | Teste3 | 

TableA 
| 1 | 1 | Teste1 | 
| 2 | 2 | Teste2 | 
| 2 | 3 | Teste3 | 
| 2 | 4 | Teste4 | 

Result must be 
| 1 | 1 | Teste1 | 
| 2 | 3 | Teste3 | 
+0

Warum können Sie eine Linq-Abfrage nicht verwenden? – Fran

+0

könnte ich tun, irgendwelche vorschlagen? – Kino

Antwort

0

gut, bekam ich einen anderen Code mit Kriterien,

Disjunction ConjuntoOr = Restrictions.Disjunction(); 

foreach (ClassA item in itens) 
{ 
    ConjuntoOr.Add 
    (
     Expression.Conjunction() 
     .Add(Restrictions.Eq("ID_1", item.ID_1)) 
     .Add(Restrictions.Eq("ID_2", item.ID_2)) 
    ); 
} 

ICriteria criteria = 
    mySession 
     .CreateCriteria<ClassA>() 
     .Add(ConjuntoOr) 
     .List<ClassA>(); 

Abfrage genereted von NHibernate

NHibernate: 
SELECT 
    this_.ID_1 as COD1_6_0_, 
    this_.ID_2 as COD2_6_0_, 
    this_.Nome as NOME3_6_0_ 
FROM 
    dbo.TableA this_ 
WHERE 
    (
     (this_.ID_1 = @p0 and this_.ID_2 = @p1) or 
     (this_.ID_1 = @p2 and this_.ID_2 = @p3) 
    ); 

@p0 = '1' [Type: String (4000)], @p1 = '1' [Type: String (4000)], 
@p2 = '2' [Type: String (4000)], @p3 = '3' [Type: String (4000)] 

Das so ziemlich das, was ich suchte. Thx für this post

0

so

var classAList = List<ClassA> { new ClassA { ... }, ....}; 

var containsClassAList = mySession.Query<ClassA>().Where(c => classAList.Contains(c)); 

so ähnlich. das obige ist Pseudocode. Ich habe gerade kein Nhibernate-Projekt vor mir. Aber ich habe vorher schon mal benutzt. Sie könnten auch All();

+0

Ich habe einen Fehler bei dieser Abfrage, ich konnte zwei Spalten nicht anpassen. Ich werde weiterhin nach einer anderen Lösung suchen – Kino

+0

Sie würden nicht passen 2 Spalten hinein, Sie würden die gesamte Klasse senden. – Fran

+0

Ich bin sry, aber ich denke, ich könnte den Code anwenden, wie du gesagt hast. Ich habe Fehler bekommen und konnte nicht festlegen, welche Spalten ich filtern möchte. In diesem Fall sind es nur zwei von drei Spalten. – Kino