2017-06-12 14 views
0

これについて質問された多数の質問を経て、解決策を見つけようとしましたが運はありませんでした。ここに私の状況ですので:。LINQ JOINで2つの異なるデータコンテキストを使用するクエリ

private IQueryable<tblB> MT; 
var IDs = (from z in db1.tblA 
      where z.TA == User.Identity.Name 
      select z).ToArray(); 

MT = from s in db2.tblB 
    join a in IDs on s.BP equals a.BP         
    select new tblB() { LastName = s.LastName}); 

return View(MT.ToPagedList(pageNumber, pageSize)); 

私はreturn文で例外を取得しています - $例外{ "タイプの定数を作成できません『TBLA』はプリミティブ型または列挙型はこのコンテキストではサポートされています。 "} System.NotSupportedException

ID配列をデバッグすると、tblAからのデータがあることがわかりますが、結合による2番目のクエリは機能していないようです。私は間違いをしています。助けて!!!そして、そのメモリ内のリストを使用

var IDs = (from z in db1.tblA 
      where z.TA == User.Identity.Name 
      select z.BP).ToArray(); 

:あなたが必要なプリミティブデータを返すために、最初のクエリを変更する、

まず:あなたが生成しIN SQL句にするためにContainsを使用する必要が

+0

db1.tblA.AsEnumerable()&db1.tblB.AsEnumerable()を使用しないでください。 – jdweng

答えて

2

ところで、これは2つのコンテキスト操作ではありません。最初のコンテキストのデータをメモリにロードしています(.ToArray()に気付いています)。次に、これらのメモリ内データを使用して2番目のコンテキストをクエリします。

+0

return line {"エンティティまたは複合型 'tblB'をLINQ to Entitiesクエリで構築できません。}} – citm09

+0

@ citm09これは別の問題です。あなたの元の質問とは関係がなく、ここへの答えです:https://stackoverflow.com/a/12916245/3185569 – user3185569

+0

私は例外を与えていた新しい新しいtblBオブジェクトを作成していました。かつて私は例外がなくなったことを取り除いた。ありがとうございます。私は何時間も立ち往生し、何をすべきか分からなかった。 – citm09

0

tblBのすべての要素が、IDsの要素のBPプロパティの少なくとも1つと等しいプロパティBPを持つようにします。

問題は、ToList()IDsがローカルメモリにあり、db1.tblBがデータベース上にあることです。両方のシーケンスを同じプラットフォームに、データベースにもローカルメモリにも持っていなければなりません。より効率的なものは、シーケンスと結果の実際のサイズに依存します。

使用するデータベース側でクエリを実行する場合は、を使用します。 IDの完全なリストがデータベースに転送され、クエリが実行され、結果がローカルメモリに転送されます。

使用すると、IDがあれば、この方法はかなり短く、あなたの結果は明らかにあなたが完全TBLBオブジェクトをしたい、ほぼ完全tblA

var result = db2.tblB 
    .Where(elementOfTableB => IDs.Contains(elementOftableB); 

新しいTBLBオブジェクトを作成する必要はありません。

tblBの要素の数と比較して多くのIDがあることが予想される場合は、AsEnumerableを使用します。 IDをデータベースに転送するには、完全なtblBをローカルメモリに転送するよりもかなり時間がかかります。

db2.TblB        // take all tblBelements 
    .AsEnumerable()     // bring to local memory 
    .join(IDs,      // join with list IDs 
     tblBElement => tblBElement.BP // take from each tblBElement the BP 
     idElement => idElement.BP  // take from each ID the BP 
     (tblBElement, idElement) => // when they match take the two records 
             // and get what you want. 
     tblBElement);     // in this case the complete tblBElement 
関連する問題