2016-08-21 2 views
1
私は

LINQのダウン5つのテーブルを選択

化学物質のように関連している5つのテーブルを持っている

- >成分 - >ソリューション - >用途は - >プロジェクトSQL-Server上

は、私がデータのプロジェクトを取得すること化学物質に関連しており、中間テーブルのデータもいくつかあります。私は(少なくともLinqPadで)次のクエリでそれを行うことができます。

from c in Chemicals 
    join i in Ingredients on c.Chem_ID equals i.Chem_ID into TempTab01 
    from tt01 in TempTab01.DefaultIfEmpty() 
     join s in Solutions on tt01.Sol_ID equals s.Sol_ID into TempTab02 
      from tt02 in TempTab02.DefaultIfEmpty() 
       join u in Usages on tt02.Sol_ID equals u.Sol_ID into TempTab03 
        from tt03 in TempTab03.DefaultIfEmpty() 
         join pro in Projects on tt03.Study_ID equals pro.Study_ID into TempTab04 
         from tt04 in TempTab04.DefaultIfEmpty() 
select new 
{ 
c_ChemID = c.Chem_ID, 
c_Name = c.Name, 
i_ChemID = (int?)tt01.Chem_ID, 
i_Sol_id = (int?)tt01.Sol_ID, 
i_IngredID = (int?)tt01.Ingred_ID, 
tt01.Amount, 
s_SolID = (int?)tt02.Sol_ID, 
s_SolName = tt02.SolName, 
u_SolID = (int?)tt03.Sol_ID, 
u_StudyID = (int?)tt03.Study_ID, 
pro_StudyID = (int?)tt04.Study_ID, 
pro_StudyNo = tt04.StudyNo, 
pro_ProjectName = tt04.ProjectName 
} 

私が参加したが、ナビゲーションプロパティの代わりに、私はドリルするために、いくつかの選択やSelectManyを使用する方法がわからない使用したくありません2つ以上のテーブルにダウン。

私はEF6を使用してSQL Serverからデータを取得しています.EdmxクラスのChemicalsはeです。 g。 1:プロジェクト= 1〜M、及び用途:M成分に関連し、溶液= 1の成分:1、用途= 1の解決策である化学

public long Chem_ID { get; set; } 
    public string Name { get; set; } 

    public virtual Person Person { get; set; } 
    public virtual Project Project { get; set; } 

    public virtual ICollection<Ingredient> Ingredients { get; set; } 
    public virtual ICollection<Usage> Usages { get; set; } 

1を有しています。希望があなたの質問に答えることを望みます。

+0

あなたはナビゲーションプロパティを表示することができますか? –

答えて

2

クラス定義にナビゲーションプロパティを指定した方がいいでしょう(結合を使うことの一つの欠点は、カーディナリティがはっきりしないことです)。

しかし、原則は簡単です。参照型ナビゲーションプロパティの場合は、コレクションタイプ - fromの場合はlet句を使用します(外部結合のセマンティクスが必要な場合は、DefaultIfEmpty()を必要に応じて追加します)。

だからあなたのモデルは、このようなものですと仮定:

class Chemical 
{ 
    public ICollection<Ingredient> Ingredients { get; set; } 
} 

class Ingredient 
{ 
    public Chemical Chemical { get; set; } 
    public Solution Solution { get; set; } 
} 

class Solution 
{ 
    public ICollection<Ingredient> Ingredients { get; set; } 
    public ICollection<Usage> Usages { get; set; } 
} 

class Usage 
{ 
    public Solution Solution { get; set; } 
    public Project Project { get; set; } 
} 

class Project 
{ 
    public ICollection<Usage> Usages { get; set; } 
} 

、クエリは次のようになります:

from c in db.Chemicals 
from i in c.Ingredients.DefaultIfEmpty() 
let s = i.Solution 
from u in s.Usages.DefaultIfEmpty() 
let p = u.Project 
... 
+0

こんにちは@ハッキーですが、あなたの編集を拒否する必要がありました。なぜなら、回答内で返信することはできないからですが、私はあなたの回答を読んで本当に感謝しています!あなたは歓迎され、喜んで助けました。あなたは(必ずしもそうではありませんが)できることは、まあ、あなたがここで見ることができます[誰かが私の質問に答えるときはどうしたらいいですか?](http://stackoverflow.com/help/someone-answers)。乾杯。 –

関連する問題