2012-04-13 70 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; 

我需要過濾只有FOOS這些項目,它具有所有屬性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 2012-04-13 05:48:02

+0

NuGet包顯示此: NHibernate 3.2.0.4000,FluentNHibernate 1.3.0.717,所以我認爲這是v3 – 2012-04-13 07:53:20

回答

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()的列表。無論如何,謝謝你。 – 2012-04-15 20:31:13

+0

然後你可以在這裏添加soln嗎? – Baz1nga 2012-04-15 20:32:38

+0

這是商業項目,所以我不能那樣做。儘管我可以創建sln來表示我的問題。我不希望在一兩天內就這樣做,但最終它會在這裏。提醒我,如果我在一兩週內忘了這麼做的話。 – 2012-04-16 10:12:50

相關問題