将对象转换为可查询对象

时间:2014-11-03 07:44:11

标签: c# linq object iqueryable

我使用了这个答案的修改版本:How to dynamically create a class in C#?来创建一个表示类型化类的动态对象。

public static object CreateNewObject(string[] columnNames)
{
    var myType = CompileResultType(columnNames);
    return Activator.CreateInstance(myType) as IQueryable;

}

然后在主app:

var obj = MyTypeBuilder.CreateNewObject(rs.ColumnNames);

我需要以某种方式将其转换为IQueryable,以便我可以执行一些Linq调用,例如.where().select()等。当然,我目前无法做到,因为我的应用程序不知道该对象的确切内容,或者该对象是什么。

所以我需要的是:

var obj = MyTypeBuilder.CreateNewObject(rs.ColumnNames);
List<obj> aListICanFill = new List<obj>();

..

aListICanFill.where(x => x.Equals("")).take(3);

我盲目地尝试了不同的演员阵容,甚至未能尝试通过对象进行迭代 - 现在我完全陷入困境。

有没有办法做到这一点?

http://msdn.microsoft.com/en-us/library/bb882637.aspx似乎是我应该抓住的东西 我的对象是什么样的:

enter image description here

2 个答案:

答案 0 :(得分:1)

如果您可以使用List&lt; dynamic&gt;你可以使用Where和Select IEnumerable&lt; T&gt;扩展方法如下。这不适用于IQueryable,因为这些方法需要一个不能动态的表达式。

using System;
using System.Collections.Generic;
using System.Linq;

namespace DynamicListTest
{
   internal class Program
   {
      private static void Main(string[] args)
      {
         var dynamicObjects = GetDynamicObjects().Cast<dynamic>().AsEnumerable();

         var itemsToPrint = dynamicObjects
            .Where(item => item.Age > 30);

         foreach (var item in itemsToPrint)
         {
            Console.WriteLine(item);
         }

         Console.ReadKey();
      }

      private static IQueryable GetDynamicObjects()
      {
         return new List<dynamic>()
         {
            new { Name = "A", Age = 10 },
            new { Name = "B", Age = 20 },
            new { Name = "C", Age = 30 },
            new { Name = "D", Age = 40 },
            new { Name = "E", Age = 50 },
         }.AsQueryable();
      }
   }
}

打印

{姓名= D,年龄= 40}

{姓名= E,年龄= 50}

答案 1 :(得分:0)

检查linq到对象

http://msdn.microsoft.com/en-us/library/bb397919.aspx

希望你的对象包含一个数组?

你能举例说明你想如何查询吗?还有CompileResultType的作用吗?

var myType = CompileResultType(columnNames); 

编辑

供将来参考 - 正如Shane所建议 - OP正在尝试 - Dynamic Linq dynamiclinq.codeplex.com