2009-07-24 3 views
0

簡体繰り返しコードは、私は、クエリを作成する一般的な関数を作成したかったが、それについて移動する方法がわからないこのジェネリック型のC#スニペットをコーディングするには?各エンティティタイプのため

public IList<entity1> GetEntity1(.. query params ..) 
{ 
    IQueryable<entity1> query = context.entity1; 

    query = from refDataType in query 
      where refDataType.Id > 0 
      select refDataType; 
    . 
    . plus more changes to query same for each entity 
    . 

    return query.ToList(); 
} 

のですか?

つまり、次のスニペットの「ReturnAGenericQueryをコードするにはどうすればよいですか?

public IList<entity1> GetEntity1(.. query params ..) 
{ 
    IQueryable<entity1> query = context.entity1;  
    query = ReturnAGenericQuery of type entity1 
    return query.ToList(); 
} 

public IList<entity2> GetEntity2(.. query params ..) 
{ 
    IQueryable<entity2> query = context.entity2;  
    query = ReturnAGenericQuery of type entity2 
    return query.ToList(); 
} 

private IQueryable<T> ReturnAGenericQuery<T>() 
{ 
    return IQueryable of entity1 or entity2 
} 

答えて

3

あなたの例では、少し曖昧ですが、それはあなたがの線に沿って何か必要があるように見えます:

private IQueryable<T> ReturnAGenericQuery<T>(IQueryable<T> source) 
    where T : SomeBaseTypeForAllYourEntities 
{ 
    IQueryable<T> result = 
     from refDataType in source 
     where refDataType.Id > 0 
     select refDataType; 

    // Other stuff here 

    return result; 
} 

public IList<Entity1> GetEntity1(...) 
{ 
    return ReturnAGenericQuery(context.entity1).ToList(); 
} 

をTタイプにする必要があるので、あなたが「where T :」節を必要とする理由は、あなたのLINQ where節が動作するためのプロパティ 'Id'を持っています。そのため、そのプロパティを定義する基本クラスからEntity1とEntity2を派生させる必要があります。 'その他のもの'に他のプロパティが必要な場合は、これらも基本クラスに追加する必要があります。

補遺:
context.entity1た場合は(を参照していることを何でもコレクション)IQueryable<entity1>ではありません、そして、あなたが代わりにcontext.entity1.AsQueryable()を使用する必要があります。

元は私のクエリが間違っていたので、in result ... duhではなく、from refDataType in sourceをクエリすることになっていました。

適切な種類の継承構造(下記参照)があれば、これはうまくコンパイルされます。

public class SomeBaseTypeForAllYourEntities 
{ 
    public int Id { get; set; } 
} 

sealed public class Entity1 : SomeBaseTypeForAllYourEntities 
{ 
    ... other properties, etc. ... 
} 
+0

メソッドに2番目の型パラメータを渡すまで、これはコンパイルされません( 'source'と 'query'に同じ名前を付けても)。 'result'はエンティティタイプTと同じではないIQueryable です。 –

+0

'AsQueryable()'が見つかりませんでした。クエリに誤字がありましたが、 ...絶対に明確になるようにもっと詳細を加えました。 – jerryjvl

1

インターフェイスが必要です。

+0

IHasRefDataTypeはlolcatsインターフェイスですか? ;) –

+0

@Robert:いいえ、それは確かにIHazRefDataTypeでしょうか? – jerryjvl

+0

はい、あなたの日を明るくしてくれることを願ってください;) –