仅显示字符串数组中的列

时间:2017-05-10 13:23:58

标签: c# entity-framework linq

我的实体中有一个包含370列的表!此外,我有一个字符串数组,在运行时之前是未知的(来自网站)。

e.g:

string [] columns = {"column1", "column2", "column3"}

我如何向我的实体发出一个linq,只给出了给定列的结果?

我搜索了几个小时,但直到现在还没有提出任何建议?

3 个答案:

答案 0 :(得分:0)

这不是Linq-to-Entities可以做的事情。您需要能够在代码中声明列。

更好的方法是使用数组中的列名在Sql中创建查询,并使用Dapper之类的内容将结果映射到对象。

答案 1 :(得分:0)

您可以在Delegate中实例化一个ExpandoObject,并使用Reflection获取传入数组中指定的列。

以下内容:

List<IDictionary<String, Object>> List = Context.Row_Type.Select(delegate(Row_Type Row) {

      IDictionary<String, Object> Out = new ExpandoObject() as IDictionary<String, Object>;

      PropertyInfo[] PIs = Row.GetType().GetProperties();

      foreach(PropertyInfo PI in PIs) {
        if(PI.GetIndexParameters().Length == 0) {
          Out.Add(PI.Name, PI.GetValue(Row));
        }
      }

      return Out;

    }).ToList();

将返回List&lt; IDictionary的&LT;字符串,对象&gt;&gt;使用所有属性,返回所需的列,只能通过PI.Name:

进行区分
    if(PI.Name == "Desired column"){ // Or Array index

       // Add to Out:
       Out.Add( PI.Name, PI.GetValue(Row) )

    }

答案 2 :(得分:0)

我猜你真的不想返回一个包含未知列名的类。列名和值的字典是否适合您?您的查询仍然需要检索所有列,但您只能返回您关注的列。

string [] columns = {"column1", "column2", "column3"}

var entity = GetEntity();
var dictionary = columns.ToDictionary(c => c, c => entity.GetType().GetProperty(c).GetValue(entity));

或者,如果你有一个集合......

var entities = GetEntities();
var results = entities
    .Select(e => columns.ToDictionary(c => c, c => e.GetType().GetProperty(c).GetValue(e)));