Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 动态Linq Select强制转换为IEnumerable_C#_Linq_Reflection_Dynamic Linq - Fatal编程技术网

C# 动态Linq Select强制转换为IEnumerable

C# 动态Linq Select强制转换为IEnumerable,c#,linq,reflection,dynamic-linq,C#,Linq,Reflection,Dynamic Linq,我正在创建一个小部件生成器,它动态地接受查询并返回一个带有结果的数据表。注意:这使用动态Linq接受可以找到库源的字符串查询 我唯一的问题是将结果集强制转换为IEnumerable public DataTable GetEntityData<D>(string Query, int NumbOfResults, List<string> Columns) where D : class { ObjectContext ob

我正在创建一个小部件生成器,它动态地接受查询并返回一个带有结果的数据表。注意:这使用动态Linq接受可以找到库源的字符串查询

我唯一的问题是将结果集强制转换为IEnumerable

    public DataTable GetEntityData<D>(string Query, int NumbOfResults, List<string> Columns)
       where D : class
    {

        ObjectContext objectContext = ((IObjectContextAdapter)this).ObjectContext;

        var FDW = (objectContext.CreateObjectSet<D>() as IQueryable<D>).Where(Query).Take(NumbOfResults);

        string Column = "new(ID, ExtTitleID)";

        var res = FDW.Select(Column).Cast<object>().ToList();            

        return DataTableCaster.CreateTableObj(res);

    }

下面的代码无法获取内部类型的子属性。

我将Dynamic.cs类重写为supper Ienumerable select,而不是Iqueryable,后者现在将支持我的强制转换。要重写该类,请使用以下代码

    public static IEnumerable<T> Select<T>(this IEnumerable source, string selector, params object[] values)
    {
        return Select(source, selector, values).Cast<T>();
    }
    public static IEnumerable Select(this IEnumerable source, string selector, params object[] values)
    {
        if (source == null) throw new ArgumentNullException("source");
        if (selector == null) throw new ArgumentNullException("selector");
        LambdaExpression lambda = DynamicExpression.ParseLambda(source.AsQueryable().ElementType, null, selector, values);
        return source.AsQueryable().Provider.CreateQuery(
            Expression.Call(
                typeof(Queryable), "Select",
                new Type[] { source.AsQueryable().ElementType, lambda.Body.Type },
                source.AsQueryable().Expression, Expression.Quote(lambda)));
    }
您可以在FDW.SelectColumn select row.ToListAvailable重复中使用类似于var res=from dynamic row的内容
         // I cannot grab the correct Properties with this
         var FD = from p in FDW.ToList()
                 select
                 (
                   (
                    from col in Columns
                    select p.GetType().GetProperty(col).GetValue(p, null).ToString()
                   ).ToList()
                 ).ToList();
    public static IEnumerable<T> Select<T>(this IEnumerable source, string selector, params object[] values)
    {
        return Select(source, selector, values).Cast<T>();
    }
    public static IEnumerable Select(this IEnumerable source, string selector, params object[] values)
    {
        if (source == null) throw new ArgumentNullException("source");
        if (selector == null) throw new ArgumentNullException("selector");
        LambdaExpression lambda = DynamicExpression.ParseLambda(source.AsQueryable().ElementType, null, selector, values);
        return source.AsQueryable().Provider.CreateQuery(
            Expression.Call(
                typeof(Queryable), "Select",
                new Type[] { source.AsQueryable().ElementType, lambda.Body.Type },
                source.AsQueryable().Expression, Expression.Quote(lambda)));
    }