2016-12-13 122 views
2

我有一個對象列表(比如說family),每個對象都包含一個其他非值類型對象(比如孩子)的列表。我想查詢這個列表並動態地指定where子句(在運行時)。動態LINQ查詢嵌套對象

var fselected = from f in families 
       from c in f.Children 
       where (f.FamilyAge > 15 && c.Age > 13) 
       select f; 

我發現,那樣做是對的NuGet動態LINQ最接近的事,但超出了簡單在頂層對象條款,我不能找到如何做上述表示的任何實例。

我能想到的唯一的解決辦法是分割成獨立的,其中C和適用於F條款,第一次運行c查詢,然後運行上得到的數據集合F查詢...

+1

可能重複[如何從字符串創建LINQ查詢?](http://stackoverflow.com/questions/5139467/how-to-create-linq-query-from-string) – Fruchtzwerg

回答

0

不使用字符串讓你的用戶在你的數據庫上創建動態查詢,這會讓你容易受到sql注入的攻擊。相反,使用字符串,可讓使用者查詢您的分貝時暴露空的參數的給用戶

public Family GetFamily(int? familyAge, int? age) 
{ 
    var families = GetAllFamilies(); 

    if(familyAge.HasValue) 
     families = families.Where(x => x.familyAge = familyAge.value); 

    if(age.HasValue) 
     families = families.Where(x => x.age = age.value); 

    return familes.ToList(); 
} 

更新

儘管注射的問題,你可以使用Dynamic Linq Library來傳遞一個字符串作爲查詢。但我建議不要使用這個。

+0

感謝您的回覆。我提供了一個過於簡單的案例。現在想象一下,我的家庭對象有20個屬性,而另一個孩子有20個屬性,我將來會繼續添加屬性。我想讓用戶從一行中輸入一個或兩個或所有的查詢。構建UI以適應這種情況是不可行的。 – AVSTR

+0

您對所有場景進行正確編碼的懶惰無法讓您的數據庫對用戶開放。這樣做只是錯誤的。儘管如此,您仍然必須編寫所有場景,不管是通過錯誤地使用字符串還是正確傳遞可空參數。 – Stormhashe

+0

雖然您的代碼對數據庫更安全,但它不能解決手頭上的問題,這是爲了能夠在運行時生成查詢。考慮一下這樣簡單的事:familyAge> 10 || familyAge <7 | familyAge = 8。需要多少GetFamily函數來完成所有排列? – AVSTR