2014-05-07 34 views
-4

如何查询类型T的集合,返回T的所有项,其中任何T的属性包含一些字符串?LINQ查询的任何属性都包含字符串

编辑:

假设我的每个属性转换为字符串检查之前,如果包含。

+0

到目前为止您尝试过做什么,以及您在实施过程中遇到了哪些问题? – Servy

+0

'42'是否包含任何字符串?也许一些示例代码会使问题更加清晰...... –

+0

@Downvoter请在评论中说明理由。试着帮忙。 –

回答

9

你的意思是这样的吗?

list.Any(x => x.GetType() 
      .GetProperties() 
      .Any(p => 
      { 
       var value = p.GetValue(x); 
       return value != null && value.ToString().Contains("some string"); 
      })); 

,如果你得到的类型和性质只有一次这可能是更有效的:

var type = list.GetType().GetGenericArguments()[0]; 
var properties = type.GetProperties(); 
var result = list.Any(x => properties 
      .Any(p => 
      { 
       var value = p.GetValue(x); 
       return value != null && value.ToString().Contains("some string"); 
      })); 

注:,如果你想查询任何属性是否包含一些字符串,使用Any,如果您还想获得符合您标准的项目,请使用Where方法而不是第一个Any。使用list.Where(x => properties.Any(...));

+0

为什么downvotes? – Kevin

+0

接受这个答案,因为它有2个例子。谢谢。 – eomeroff

+0

的确更高效。我想,你应该把第一个Any取代为Where。 –

3

你可以使用反射(这个版本效率不高,但你有想法)。

myList.Where(m => m.GetType().GetProperties().Any(x => x.GetValue(m, null) != null && x.GetValue(m, null).ToString().Contains("someString")); 
+0

谢谢,我想我必须去反思。 – eomeroff

+0

@eomeroff相对于? – Servy

+0

@Servy与编译时知道属性相反。这是我对效率警告的回应。 – eomeroff

相关问题