2011-11-11 9 views
1

DBから会議室のリストを取得する簡単な機能があります。LINQ with Generic Parameter

public List<ConferenceRoom> RunRoomQuery<T1>(T1 fieldValue, Func<ConferenceRoom, T1, bool> predicate) 
    { 
     var confRooms = _dataContext.ConferenceRooms.Where(delegate(ConferenceRoom c) 
     { 
      return predicate(c, fieldValue); 
     }); 
     return confRooms.ToList(); 
    } 

は、それが正常に動作します。: 私は次の関数を使用していますあなたが気づいたように、私は "ConferenceRoom"タイプを渡しています。 代わりに、私はそれがより汎用的にすると、このようにT2を渡すしたいと思います:

public List<T2> RunRoomQuery<T1,T2>(T1 fieldValue, Func<T2, T1, bool> predicate) 
    { 
     var confRooms = _dataContext.ConferenceRooms.Where(delegate(T2 c) 
     { 
      return predicate(c, fieldValue); 
     }); 
     return confRooms.ToList(); 
    } 

confRoom.ToList()「どこで」のどちらかそれについて幸せではないコンパイルしていません。

質問:なぜですか?私はそれが何であるか? 以下はエラーです:

error CS0305: Using the generic method 'ConferenceDB.ConferenceDb.RunRoomQuery<T1,T2>(T1, System.Func<T2,T1,bool>)' requires 2 type arguments 
C:\Projects\ConferenceDB\ConferenceDB.cs(82,25): (Related location) 
C:\Projects\ConferenceDB\ConferenceDB.cs(69,27): error CS0305: Using the generic method 'ConferenceDB.ConferenceDb.RunRoomQuery<T1,T2>(T1, System.Func<T2,T1,bool>)' requires 2 type arguments 

なぜですか?

+0

一般的なタイプは、 'ConferenceRooms'コレクションと互換性がなければなりません。クエリから返された項目が 'T2'と同じでない限り、' .ToList() 'は動作しません。また、 '.Where()'が 'null'を返さないように注意する必要があります。 –

答えて

1

List<ConferenceRoom>のタイプのリストがList<T2>にキャストされることを期待していると思います。

T2には制約はありませんが、これは不可能です。

public List<T2> RunRoomQuery<T1,T2>(T1 fieldValue, Func<T2, T1, bool> predicate) where T2 : ConferenceRoom 

私も_dataContext.ConferenceRoomsのタイプはIEnumerable<ConferenceRoom>ので、でも上記の制約で、それは動作しません疑います。

なぜ私はあなたがそれを一般的にしたいのか分からないので、より良い解決策を提供することはできませんか?

+0

これをより一般的にしたいのは、たとえば、新しい述語とユーザータイプをT2に渡すなど、「管理者権限を持つすべてのユーザー」を取得するなど、他のすべてのクエリを実行したいということです。全体のLINQとC#のように私はいくつかの助けを使うことができたと思っていました....私は渡す必要のある無関係の型であるので制約を置くことはできません...私はいくつかの共通のダミー型それはうまく動作しないかもしれません...確信していません –

+0

そして、どの変数がユーザーに格納されていますか?それは '_dataContext.ConferenceRooms'ですか? – Iain

+0

私はあなたが** over general **をしようとしていると思っています。上記の関数は、解決しているより複雑です。私もかなり良いです;)単純化しようとしているコードを追加すると、いくつかのアイデアを共有できます。 – Iain

1

_dataContext.ConferenceRoomsは、ConferenceRoomのコレクションです。
したがって、Where()の拡張方法はT2ではなくConferenceRoomになります。


一般的な方法のポイントは、異なるタイプで動作するようにジェネリック –ことがあります。
ConferenceRoomでのみ機能するため、メソッドを汎用にすることは意味がありません。

+0

OKこれは良い答えでした....ここで私がやろうとしていることは....エンドユーザーはさまざまなタイプのデータ項目を検索します。 ....場所 '上層階'と私はすべての会議室を与える....また、「会議室を予約したすべてのユーザーに...」などの問い合わせを行うこともできますが、コンパイル時に定義される有限の数のクエリが作成されます。適切なプレディカを使って1つの一般的な関数を書くことで逃げることを望んでいるかもしれません(おそらく怠け者です)。データをフィルタリングします。 –