2017-01-25 110 views
0

は私がJOIN(INNER, OUTER)を使用したことがない、と最良のシナリオであるとき、私はどんな考えを持っていない:私は決してJOINを使用していません。適切な時はいつですか?

ここ

私は、オブジェクトを取得するには2つのまたは3のクエリを使用していますActionResultsの2つの例を持って、使用することをお勧めではありませんa JOIN

第1の例:

public ActionResult JobTags(int id) 
{ 
    var jobTagsList = (from j in db.JobTags 
          where j.JobID == id 
          select j.TagID).ToList(); 

    var tags = (from j in db.Tags 
        where jobTagsList.Contains(j.ID.ToString()) 
        select j).ToList(); 

    return View(tags); 
} 

が最後にそのjは私だけJOINこの二つのテーブルとを選択することはできますか?

第2の例:

public ActionResult ImageListWhoApp(int id) 
{ 
    //We get here the ID from Job page using dbo.Jobs 
    var userIdList = (from j in db.Jobs 
          where j.ID == id 
          select j.ID.ToString()).ToList(); 

    //We get here who applied at this job using dbo.AppliedJobs 
    var appJobIdList = (from j in db.AppliedJobs 
        where userIdList.Contains(j.JobID.ToString()) 
        select j.UserID).ToList(); 

    //Finally we get here the avatars of the user who applied at the job 
    //We are using this as a hyperlink to user profile. 
    var appUserImage = (from j in db.Images 
          where appJobIdList.Contains(j.UserID.ToString()) 
          select j).ToList(); 

    return View(appUserImage); 
} 

は、このアプローチはばかげてきませんか?このようにしてこのようなことをするのは普通ですか?どのようにしてJOINをこの3のSQLから作成しますか?出来ますか?それは良い方法ですか?

ありがとうございました!

+1

モデルクラスにナビゲーションプロパティがありませんか?それらは、ほとんどの場合、結合を不要にするものです。 –

+1

私もLINQの 'JOIN'は冗長でT-SQLの' JOIN'に比べて制限があるためです。 – qxg

+1

EFを使用し、ナビゲーションプロパティを持っている場合、通常は 'JOIN'は必要ありません。しかし、あなたが結合したいオブジェクトを持つ2つのリストを持っているなら、それは多くの意味があります。 – Oliver

答えて

1

ジョインは必要ありません。あなたは、ナビゲーションプロパティを使用することができます。

var tagsQry = 
    from tag in db.Tags 
    where tag.JobTag.JobID == id 
    select tag; 

var userImageQry = 
    from img in db.Images 
    from appJob in db.AppliedJobs 
    where (img.UserID == appJob.UserID) && (appJob.Job.ID == id) 
    select img; 

あなたは何のナビゲーションプロパティを持っていない場合でも、あなたが必要としない加入:

var tagsQry = 
    from tag in db.Tags 
    from jobTag in sb.JobTags 
    where (jobTag.JobID == id) && (tag.ID == jobTag.TagID) 
    select tag; 

var userImageQry = 
    from img in db.Images 
    from appJob in db.AppliedJobs 
    from job in db.Jobs 
    where (img.UserID == appJob.UserID) && (appJob.JobID == job.ID) && (job.ID == id) 
    select img; 

あなたはしかし、使用することができますが、構文を好む場合は結合します。 DB側のクエリ実行プランはまったく同じになります。

var tagsQry = 
    from tag in db.Tags 
    join jobTag in sb.JobTags on tag.ID equals jobTag.TagID 
    where (jobTag.JobID == id) 
    select tag; 

var userImageQry = 
    from appJob in db.AppliedJobs 
    join img in db.Images on appJob.UserID equals img.UserID 
    join job in db.Jobs on appJob.JobID equals job.ID 
    where (job.ID == id) 
    select img; 

を2番目の例では、あなたがAppliedJobs.JobIDに外部キー制約を持っていない場合にのみ、クエリを必要とする(または結合)Jobsに。そうした場合、AppliedJobs.JobIDと直接idを比較することができます。

+0

実際に私はナビゲーションプロパティを忘れてしまったのですが、MVCを勉強してから長い時間が経っても、私のジレンマは「JOIN」であり、なぜ使用しないのかは分かりませんでした。 – Eduard

関連する問題