Home Articles

动态Linq选择转换为IEnumerable

Asked
Viewed 892 times
1

我正在创建一个Widget构建器,它动态地接收查询并返回带有结果的数据表 . 注意:这使用Dynamic Linq接受字符串查询,可以找到库源here

我唯一的问题是将结果集转换为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);

    }

这是一种在线投射的尝试

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

我得到错误“无法将类型'DynamicClass1'强制转换为'System.Object'.LINQ to Entities仅支持转换EDM原语或枚举类型 . ”

它必须是一个匿名类型,所以我可以获取实体相关的属性我不能使用反射即将其转换为字符串列表

// 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();

下面的代码无法获得内部类型的子属性 .

1 Answer

  • 0

    我重写了Dynamic.cs类以支持Ienumerable而不是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)));
        }
    

Related