私はC#、.Net 4.5、MVC、エンティティフレームワーク5.0を最初にコードで使用しています。devexpress の例の 1 つを使用するとエラーが発生しました。問題は、groupby 値と集計 (カウント) クエリのリストを取得することにあります。
エラーは、型 'System.Int32' を型 'System.Object' にキャストできません。LINQ to Entities は、大文字と小文字の EDM プリミティブまたは列挙型のみをサポートします。
エンティティ/テーブルは
public class Test
{
[Key]
public int ID { get; set; }
public string Name { get; set; }
public DateTime SubmitDate { get; set; }
public int TotalValue { get; set; }
}
グループ化情報を取得するテスト コード
public void GetGroupInfo()
{
GetGroupInfo(Context.Tests, "TotalValue");
GetGroupInfo(Context.Tests, "Name");
}
public static void GetGroupInfo(this IQueryable query, string fieldName)
{
CriteriaToExpressionConverter converter = new CriteriaToExpressionConverter();
var rowType = query.ElementType;
query = query.MakeGroupBy(converter, new OperandProperty(fieldName));
query = query.MakeOrderBy(converter, new ServerModeOrderDescriptor(new OperandProperty("Key"), false));
/*
i think the problem is from here
*/
query = ApplyExpression(query, rowType, "Key", "Count");
// ignore the GridViewGroupInfo, just a class to store the value
var list = new List<GridViewGroupInfo>();
foreach (var item in query)
{
var obj = (object[])item;
list.Add(new GridViewGroupInfo() {KeyValue=obj[0], DataRowCount =(int)obj[1]});
}
}
static IQueryable ApplyExpression(IQueryable query, Type rowType, params string[] names)
{
var parameter = Expression.Parameter(query.ElementType, string.Empty);
var expressions = names.Select(n => query.GetExpression(n, rowType, parameter));
var arrayExpressions = Expression.NewArrayInit(
typeof(object),
expressions.Select(expr=>Expression.Convert(expr,typeof(object))).ToArray()
);
var lambda = Expression.Lambda(arrayExpressions, parameter);
var expression = Expression.Call(
typeof(Queryable),
"Select",
new Type[] { query.ElementType, lambda.Body.Type },
query.Expression,
Expression.Quote(lambda)
);
return query.Provider.CreateQuery(expression);
}
static Expression GetExpression(this IQueryable query, string commandName, Type rowType, ParameterExpression parameter)
{
switch (commandName)
{
case "Key":
return Expression.Property(parameter, "Key");
case "Count":
return Expression.Call(typeof(Enumerable), "Count", new Type[] { rowType }, parameter);
}
return null;
}
グループ化が「Name」(文字列)タイプまたは「TotalValue」(int)タイプに関係なく、エラーが発生します。誰でも助けることができますか?この.net、mvc、およびlinq全体についてまだ学んでいるので、誰かがなぜ、何を、どのように教えてくれたら感謝します。