【问题标题】:Convert object to a queryable将对象转换为可查询
【发布时间】:2014-11-03 07:44:10
【问题描述】:

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

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

}

然后在主应用中:

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 似乎是我应该关注的东西。
我的对象是什么样子的:

【问题讨论】:

  • 你到底需要什么语法? {您的对象数组}.Select(...) 或 {您的对象}.Select(...) ?
  • 您是否尝试过在课堂上实现IQueryable?或者你真正想要的是一个List&lt;MyClass&gt;,你可以在.Where()上做?
  • 所以这个对象将是我的类 - 像 List&lt;thisObject&gt; 这样的东西是最好的情况。
  • @RufusL 虽然它作为一个对象返回,而不是一个类......
  • @SemiDemented 如果你想要这个,匿名类不是你应该去的方式。检查此线程stackoverflow.com/questions/191013/… 但是,您可以制作对象列表List&lt;Object&gt;

标签: c# linq object iqueryable


【解决方案1】:

如果你可以使用 List 你可以使用 Where 和 Select IEnumerable 扩展方法,如下所示。这不适用于 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 }

【讨论】:

  • 在我的例子中,GetDynamicObjects 返回一个动态填充的对象,而不是一个方便的 List。如果我可以将对象转换为我最初尝试做的 List,这将起作用。
  • @SemiDemented 哦好吧,它有助于查看代码。我已经编辑了答案以使用 IQueryable 作为源数据,这对您有帮助吗?请注意,它必须先转换为 IEnumerable。
【解决方案2】:

检查 linq 到对象

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

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

您能否举例说明您想如何查询它?还有 CompileResultType 有什么作用?

var myType = CompileResultType(columnNames); 

编辑

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

【讨论】:

  • 我已经用我的对象的样子更新了我的 Q - 比如myType.Where(x =&gt; x.CompanyName == "Test").Take(3);
  • ok 试试这样的方法 -- return ((IEnumerable)Activator.CreateInstance(myType)).AsQueryable();
  • 记住这只是动态类的名称 - 还没有数据...但是我收到此错误:Unable to cast object of type 'MyDynamic' to type 'System.Collections.IEnumerable'.
  • 这似乎有非常具体的类型 - 我不知道如何在不知道自己想要什么的情况下创建 ExpandoObject。
猜你喜欢
  • 1970-01-01
  • 2014-12-30
  • 2019-12-29
  • 1970-01-01
  • 1970-01-01
  • 2017-02-24
  • 1970-01-01
  • 2017-08-29
相关资源
最近更新 更多