2009-03-06 7 views
0

1:1のリレーションシップを持つ2つのテーブルアカウントとアドレスがあります。アカウントにはアドレスが入っています。私はdbmlファイルに関連付けを作成しました。今私は与えられたaccountidのアカウントを選択するためのクエリを作成し、その結果のアカウントにも同様にアドレスオブジェクトを含める必要があります。select linqの関連オブジェクトをSQLに戻す

using (var context = new SalesLogixDataClassesDataContext()) 
     { 
      var query = context.ACCOUNTs 
       .Where(a => a.ACCOUNTID == id) 
       .Select(a => new Account {AccountId = id, AccountName = a.ACCOUNT1, Address=a.ADDRESS}); 

      return query.FirstOrDefault(); 
     } 

しかし、返されるオブジェクトのアドレスはnullです。だから私はクエリで行う必要がありますので、アドレスオブジェクトも取得されます。

EDIT:あなたは野生のガチョウの追跡に導いてくれて申し訳ありません。アソシエーションを間違ってマッピングしました(Account.AccountIdにマップされたAddress.AddressId)。私はそれを修正し、今は正常に動作しています。助けてくれてありがとう。

答えて

2

なぜLINQ-> SQLで処理するのではなく、selectに新しいAccountオブジェクトを作成していますか?フレームワークにオブジェクトを選択させる場合は、プロパティのEntityRefを適切に設定する必要があり、関連付けが機能するはずです。

using (var context = new SalesLogixDataClassesDataContext()) 
    { 
     var query = context.ACCOUNTs 
      .Where(a => a.ACCOUNTID == id); 

     return query.FirstOrDefault(); 
    } 

ただ、編集、あなたはまた、DBMLデザイナーを介してこれを行うことができます生成された名前からプロパティ名を変更するために選択されているので、あなたが得る物はフレンドリーですが、まだ経由して、テーブルに関係を維持している場合実際の列名。

コードの2回目の見直し(私はエンティティの設定を誤って読んでいます)元の回答から無効なテキストを削除しました。

ここでは、モデルオブジェクトをより親しみやすくして、クエリで手動で翻訳するのではなく、XMLの例を示します。

<Table Name="dbo.ACCOUNT" Member="Accounts"> 
    <Type Name="Account"> 
     <Column Name="ACCOUNTID" Member="AccountId" Type="System.Int32" DbType="Int NOT NULL" IsPrimaryKey="true" CanBeNull="false" /> 
     <Column Name="ACCOUNT1" Member="AccountName" Type="System.String" DbType="VarChar(...) NOT NULL" CanBeNull="false" /> 
     <Association Name="Address_Account" Member="Address" ThisKey="ThisTablesFKIDToAddress" OtherKey="AddressTablePKID" Type="Address" IsForeignKey="true" /> 
    </Type> 
</Table> 

あなたははるかに容易にし、また、で動作するようにあなたのアドレスオブジェクトは、よりよいになるだろうデザイナーを介してこれを行うことができます。

とにかく私はこれが役に立つと思っています。エンティティを設定することで何が起こっているのかを確かめることはできません。アカウントオブジェクトのコードを投稿したい場合は、ここから。もちろん

あなたのモデル化を変更した場合セレクトコードは、より多くのようになりますオブジェクト:

using (var context = new SalesLogixDataClassesDataContext()) 
{ 
    return context.Accounts.FirstOrDefault(account => account.AccountId == id); 
} 
0

は、設定したオブジェクトの関係、特殊キーが関与を詳しく見てみましょう。カスタムオブジェクトを使用する必要があるかどうかにかかわらず、リレーションが正しく構成され、データがdb内にある限り、指定したクエリは関連するアドレスを取得します。ここで

がStateMasterがCustomerMasters1性を有しているサンプル実生活の設定、である(命名はクリーンアップされている:)

alt text http://s5.tinypic.com/ohl00l.jpg

+0

私はコードに基づいて、考えていたものであるという関係がある場合は掲載アカウントオブジェクトが正しい参照を持つように修正します。しかし、アカウントオブジェクトが行っているようないくつかの変数と、トップレベルクエリから返された実際のlinqオブジェクトへの元のスコープ参照があります。 –

+0

うん、私は実際の生活の設定サンプルでそれを投稿するつもりだった、どういうわけか私の最初の投稿の一部を食べ​​た:( – eglasius