我尝试定义委托类型以返回我的数据集。
public Func<ArticleServerEntities, object, IQueryable<object>> GetItemsSource { get; set; }
这是我如何填充它。
class TextValuePair
{
public string Text { get; set; }
public object Value { get; set; }
}
GetItemsSource = (ctx, val) => ctx.Set<Category>()
.OrderBy(c => c.Title)
.Select(c => new TextValuePair { Text = c.Title, Value = c.Id }),
以下是我的称呼方式。
using (var context = new ArticleServerEntities())
{
action.ListBox.ItemsSource = action.GetItemsSource(context, parentValue).ToList();
}
但是调用它会生成System.NotSupportedException
例外。
无法转换类型&System; Int32&#39;键入&#39; System.Object&#39;。 LINQ to Entities仅支持转换EDM原语或枚举类型。
虽然错误消息对我来说并不合理,但我认为这与代理人返回IQueryable<TextValuePair>
而不是IQueryable<object>
这一事实有关。
但实际上我需要这个委托能够返回任何类型的IQueryable
- 就像ListBox.ItemsSource
接受任何类型的集合一样。
有没有人看到这种方法,或者更好地理解错误信息?
答案 0 :(得分:3)
错误消息表明问题出在此预测中:
.Select(c => new TextValuePair { Text = c.Title, Value = c.Id }),
您的TextValuePair
Value
成员最有可能是object
类型,而Id
类型为int
。
为了避免不受支持的强制转换,你应该真正投射到像
这样的泛型类class TextValuePair<TValue>
{
public string Text { get; set; }
public TValue Value { get; set; }
}
然后
.Select(c => new TextValuePair<int> { Text = c.Title, Value = c.Id }),