2012-04-13 2 views
0

У меня есть эта структура:LINQ - NHibernate: один элемент списка содержит все другие элементы списка

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

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

И у меня есть такие объекты, как:

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

Мне нужно отфильтровать только те элементы Фооса которые имеют все атрибуты attrs список. Я попытался это:

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

и я думаю, что это будет работать, но будет супер медленно и ... он бросает NotSupportedException ...

Кстати ... Я использую ASP.NET MVC 3 и C# 4.0, поэтому даже самые новые решения очень приветствуются.

Заранее спасибо.

+0

какая версия nhibernate вы используете? 2 или 3 конкретно – Baz1nga

+0

Пакеты NuGet показывают это: NHibernate 3.2.0.4000, FluentNHibernate 1.3.0.717, поэтому я думаю, что это v3 –

ответ

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

Я не понял запрос, который вы написали. Я не уверен, выполняет ли этот запрос то, что вы ожидаете, см. В сгенерированном sql и посмотрите, правильно ли он. Также может помочь запрос sql, который вы ожидаете увидеть, который даст вам правильный результат.

+0

Actualy, я делал все правильно (просто нужно немного изменить запрос) но узким местом было то, что NHibernate использует Lazy Loading по умолчанию, и он получал ~ 100k запросов к БД, чтобы получить все ... Не лучшая идея. Теперь я обратил все: я беру все атрибуты, которые пользователь хочет фильтровать, и они сопоставляются со всеми списками, которые у них есть. Таким образом, я получаю все списки, которые имеют все выбранные атрибуты и используют LINQ .Intersect() Я получаю все отфильтрованные. Благодарю вас. –

+0

можете ли вы затем добавить здесь soln? – Baz1nga

+0

Это коммерческий проект, поэтому я не могу этого сделать. Хотя я мог бы создать sln для представления моей проблемы. Я не обещаю сделать это через день или два, но в конце концов он будет здесь. Напомните мне, если я забуду это сделать через неделю или две. –

Смежные вопросы