2013-02-13 66 views
0

我需要基于页面模式用户选择在网格中显示实体的全部或更少属性。比如我有三个页面模式用于选择实体的不同列的动态谓词

Minimal (will show 8 properties of an entity in the grid) 

Standard (will show 12 properties of an entity in the grid) 

Extended (will show 15 properties of an entity in the grid) 

我怎样才能让选择谓词动态,包括规定没有基于用户的页面模式的实体列。可以说我有实体公司,拥有15种性质我想要做这样的事情

dbContext.Companies.Select([predicate for choosing different no of columns?]) 

回答

3

此使用Predicates你解决不了,因为他们总是返回bool

您需要的是一个函数表达式,它将Company对象作为参数并返回object。具体来说,你需要一个Expression<Func<Company, object>>

这是你如何定义三种选择:

Expression<Func<Company, object>> minimal = e => new { e.Prop1, ..., e.Prop8 }; 
Expression<Func<Company, object>> standard = e => new { e.Prop1, ..., e.Prop12 }; 
Expression<Func<Company, object>> extended = e => new { e.Prop1, ..., e.Prop15 }; 

,然后把它们作为你希望:

dbContext.Companies.Select(minimal); 
// or 
dbContext.Companies.Select(standard); 
// or 
dbContext.Companies.Select(extended); 
+0

这个解决方案感谢狼,但我在这里有一个问题。我有一个管理部分,管理员在主页上选择显示哪些属性/列。所以我得到了一个8,12或15列的字符串数组,我将如何在上面的解决方案中添加这些列。 – Waqas 2013-02-14 07:51:05

+0

@Waqas我试图用几种方法做到这一点,但迄今为止尚未成功。我认为解决方案是建立一个表达式,用实体的属性填充动态对象,但不知道如何去做,或者甚至可能。 [这个答案](http://stackoverflow.com/a/3591820/390819)给了我希望,但我仍然需要进一步挖掘。 – GolfWolf 2013-02-14 09:17:04

+0

谢谢@wolf,我也发现这个链接可能对你也有帮助。 http://www.albahari.com/nutshell/predicatebuilder.aspx – Waqas 2013-02-14 09:44:08