動的にクエリを取り込んで結果を含むデータテーブルを返すウィジェットビルダーを作成しています。注:これはDynamic 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);
}
これはラインでキャストする試みです
var res = FDW.Select(Column).Cast<object>().ToList();
「タイプ 'DynamicClass1'をタイプ 'System.Object'にキャストできません。LINQto 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();
以下のコードは、内部型のサブプロパティを取得できません。
Dynamic.csクラスをオーバーライドして、キャストをサポートするIqueryableではなくIenumerable selectをサポートしました。クラスをオーバーライドするには、次のコードを使用します
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)));
}