如何创建linq查询,其中选择列名称是变量

时间:2014-08-28 14:45:36

标签: c# linq

我有一个配置表,其中包含各种显示各种数据的权限配置,例如

PermissionTable
key1    key2    showconfig1 showconfig2
1       A            Y             N
2       B            N             N
3       C            Y             Y

各种Web服务的应用程序在代码中的不同位置对同一个表进行查询,以获取来自不同showconfig列的值以获取权限。
如何创建一个通用的集中式查询,其中app可以传递key1值,key2value和columnName变量以获取特定列行的值,而无需编写单独的查询来查询每个列行或无需编写查询以检索特定行的所有列值?

e.g。以下只返回我想要该列中的值的列名:

public string GetPermission(int key1, int key2 ,string columnName)
{
   string show = "N";  
   var show = (from p in db.PermissionTable
               where p.key1== key1
               && p.key2 == key2
               select p.[columnName]).FirstOrDefault().ToString();
   return show;
}

2 个答案:

答案 0 :(得分:1)

您可以动态地对查询应用过滤器,但根据某种类型的条件动态生成或更改结果类型并不容易。类型(匿名或其他)在编译时定义,而不是运行时。

var result = from p in db.PermissionTable
          select new { p.ColumnName, p.Key1, p.Key2 };

if(condition1)
    result = result.Where(i => i.Key1 == filter1);

if(condition2)
    result = result.Where(i => i.Key2 > 0);

var result2 = from p in result
    select p.ColumnName;

return result2.FirstOrDefault().ToString();

如果您确实需要根据不同的标准更改查询列,我认为有多个查询是合理的。

答案 1 :(得分:1)

您可以使用动态linq扩展程序,请参阅http://dynamiclinq.codeplex.com/documentation

使用此库,您可以选择以下格式的数据:

db.PermissionTable.Select("MyColumn");