2012-04-13 7 views
0

ich diese Struktur haben:LINQ - NHibernate: eine Listenelemente enthält alle anderen Listenelemente

class Foo { 
    IList<FooAttribute> Attributes { get; set; } 
} 

class FooAttribute { 
    bool IsSelected { get; set; } 
    string Value { get; set; } 
} 

Und ich habe Objekte wie:

IQuerable<Foo> foos; // Database repository object .AsQuerable() 
IList<FooAttribute> attrs; 

ich nur die Elemente von foos filtern müssen, die alle Attribute von attrs Liste haben. Ich versuchte dies:

foos = foos.Where(foo => 
        attrs.All(a => 
         foo.Attributes.Any(at => at.Value == a))); 
var filteredFoos = foos.ToList(); 

und ich denke, dass es funktionieren würde, wäre aber super langsam und ... es wirft NotSupportedException ...

By the way ... verwende ich ASP.NET MVC 3 und C# 4.0, so sind auch die neuesten Lösungen sehr willkommen.

Vielen Dank im Voraus.

+0

Welche Nhibernate-Version verwenden Sie? 2 oder 3 speziell – Baz1nga

+0

NuGet-Pakete zeigen dies: NHibernate 3.2.0.4000, FluentNHibernate 1.3.0.717, so denke ich, es ist v3 –

Antwort

1
FooAttribute fooAttributeAlias=null; 
Session.QueryOver<Foo>().Inner.JoinAlias(x=>x.Attributes,()=>fooAttributeAlias) 
.WhereRestrictionOn(()=>fooAttributeAlias).IsNotEmpty 
.List(); 

Ich habe die Abfrage, die Sie geschrieben haben, nicht verstanden. Ich bin nicht sicher, ob die obige Abfrage das tut, was Sie erwarten, sehen Sie die generierte SQL und sehen Sie, ob sie korrekt ist. Auch was helfen könnte, ist die SQL-Abfrage, die Sie erwarten, um das richtige Ergebnis zu erhalten.

+0

Actualy, ich tat alles auf die richtige Weise (nur die Abfrage musste ein bisschen geändert werden), aber der Engpass war, dass NHibernate Lazy Loading standardmäßig verwendet und es ~ 100k Anfragen an die DB holte, um alles zu bekommen ... Nicht die beste Idee. Jetzt habe ich alles umgekehrt: Ich nehme alle Attribute, nach denen der Benutzer filtern möchte, und sie werden allen Auflistungen zugeordnet, die sie haben. Auf diese Weise bekomme ich alle Auflistungen, die alle ausgewählten Attribute enthalten und mit LINQ .Intersect() bekomme ich alles gefiltert. Trotzdem Danke. –

+0

kannst du dann dann hier die lösung hinzufügen? – Baz1nga

+0

Es ist ein kommerzielles Projekt, also kann ich das nicht machen. Obwohl ich sln schaffen könnte, um mein Problem darzustellen. Ich verspreche nicht, das in ein oder zwei Tagen zu machen, aber irgendwann wird es hier sein. Erinnere mich, wenn ich das in ein oder zwei Wochen vergesse. –