2016-07-03 14 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は、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

エラーメッセージは、問題が、この投影であることを示している:あなたのIdはタイプintでありながら

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

ほとんどの場合、あなたのTextValuePairValueメンバーは、タイプobjectです。

サポートされていないキャストを避けるために、あなたは

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'でしたが、私は明らかにそれを' object'に設定して別のものを試して忘れました。私はあなたがそれを見ることができたことに非常に感銘を受けました。 –

+0

ありがとうございますが、大きな問題ではありませんでした。 * 'System.Int32'型を 'System.Object'型にキャストすることができません。*あなたが最初に尋ねるのは、私が 'int'を' object'に割り当てる場所です。 –

+1

はい、私は自分自身に尋ねました間違ってIdが_still_ an intであるという前提を作りました。 –

関連する問題