2016-12-13 95 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