返回任何类型的IQueryable

时间:2016-07-03 17:38:05

标签: c# entity-framework

我尝试定义委托类型以返回我的数据集。

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接受任何类型的集合一样。

有没有人看到这种方法,或者更好地理解错误信息?

1 个答案:

答案 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 }),