2016-07-03 4 views
1

Я пытаюсь определить тип делегата для возврата моего набора данных.Возвращение IQueryable любого типа

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' для ввода 'System.Object'. LINQ to Entities поддерживает только листинг EDM-примитивов или типов перечислений.

Хотя сообщение об ошибке не совсем имеет смысла для меня, я считаю, что это связано с тем, что делегат возвращает IQueryable<TextValuePair> вместо IQueryable<object>.

Но на практике мне нужен этот делегат, чтобы иметь возможность возвращать IQueryable любого вида - так же, как ListBox.ItemsSource принимает коллекцию любого типа.

Кто-нибудь видит способ обойти это или лучше понять сообщение об ошибке?

+0

Почему не возвращаются просто 'IQueryable' вместо' 'IQueryable ? – dotctor

+0

@dotctor: 'IQueryable' не имеет метода' ToList() '. –

+0

Отметьте это [ответ] (http://stackoverflow.com/a/37853007/3970411) – dotctor

ответ

3

сообщение об ошибке указывает на то, что проблема в этой проекции:

.Select(c => new TextValuePair { Text = c.Title, Value = c.Id }), 

Скорее всего, ваш TextValuePairValue член типа 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 }), 
+2

OMG, вы совершенно правы. Это было 'int', но я, по-видимому, поставил его на« объект », пытаясь разными способами, а затем забыл. Я очень впечатлен тем, что вы смогли это понять. –

+0

Спасибо, но это было неважно. Когда вы видите * Невозможно ввести тип «System.Int32» для ввода «System.Object» *, первое, что вы задаете себе, - это то, где heck я присваиваю 'int'' object' :) –

+1

Да, я спросил себя, что но неправильно сделал предположение, что Id был _still_ int. –

Смежные вопросы