2011-10-20 4 views
2

私はテーブルの束を持っていて、すべてがResourceIDというフィールドを持っていて、外部のプロセスから取り込まれています。私は各テーブルを調べて、そのIDをマスターリストに対して検証したいと思います。コードはシンプルですが、繰り返し取得します:異なるテーブル名を動的に指定するLinq-to-Entities(EF4)クエリをどのように呼び出すことができますか?

var resList = (from r in dc.ResourceMasterEntities select r.ResourceId).ToList(); 
var res = (from rs in resList select (int?)rs).ToList(); 

    var stage = (from s in dc.TableOne select s.ResourceId).ToList(); 
    foreach (var invalidResourceID in stage.Except(res).ToList()) 
    { 
     errList.Add("Bad ID found:" + invalidResourceID); 
    } 

    stage = (from s in dc.TableTwo select s.ResourceId).ToList(); 
    foreach (var invalidResourceID in stage.Except(res).ToList()) 
    { 
     errList.Add("Bad ID found:" + invalidResourceID); 
    } 

    // more of the same with different tables 
私はテーブル( TableOneTableTwo、など)の名前を渡すと、この反復コードのすべてを記述することはできません関数を作成したいと思います

。これはLinqでできますか? (そして好ましくは :-)を使用しないでください)

+1

** Linq-to-SQL **または** Entity Framework **について使用しているか話していますか? –

+0

それはEFですが、この文脈では重要ですか?これは、SQLデータベースに対して行うlinqです。私が間違っていたら、私を真っ直ぐにしてください。 – HitLikeAHammer

+0

** Linq-to-SQL **は、C#チームによって書かれた別個のORマッパーです。LINQの機能の「概念の証明」として多かれ少なかれ書かれています。 EFはLinq-to-Entitiesと呼ばれるLINQをサポートしています。だから、Linq-to-SQLとEFは、密接に関連する2つの独立したものですが、それぞれ異なる製品/異なるビットです。 –

答えて

3

IQueryableをパラメータとして使用する関数を作成できます。あなたはerrListとRESクラスレベルのプロパティを作るか、あなたには、いくつかの変更で機能

+0

これは良い答えですが、EntityTypeにそのようなプロパティがないので、s.ResourceIDにエラーが発生します。これを回避する方法はありますか? – HitLikeAHammer

+0

EntityTypeは、使用しているエンティティタイプの単なるプレースホルダでした。あなたのコードでは、(s.ResourceIdを選択して、dc.TableOneの中から)行ったので、そのselect文を使用しました。どのように関数を呼び出していますか? –

0

にそれらをパラメータとしてPAS場合、私はすることができた場合は、選択することができます

private void CheckTable(IQueryable<EntityType> table) 
    { 
     var stage = (from s in table select s.ResourceId).ToList(); 
     foreach (var invalidResourceID in stage.Except(res).ToList()) 
     { 
      errList.Add("Bad ID found:" + invalidResourceID); 
     } 
    } 

    // Execute the function like: 
    CheckTable(dc.TableOne); 

機能は次のようになります。これを動作させる - 私は、必要なプロパティを選択するために、組み込みの動的linqを使用しなければなりませんでした。

private void CheckTable(System.Data.Objects.ObjectSet<EntityType> table) 
{ 
     var records = table.Select("BusinessEntityNbr").ToList(); 
     var values = (from r in records select (int?)r[0]).ToList(); 

     foreach (var invalidResourceID in values.Except(res).ToList())  
     { 
      errList.Add("Bad ID found:" + invalidResourceID);  
     } 
} 
0

不明な結果の型にエンティティSQLとDbDataRecordを使用することをお勧めします。 Entity SQLを使用する方法については、http://archive.msdn.microsoft.com/EFQuerySamplesのEntity SQLサンプルを参照してください。

関連する問題