2012-01-04 3 views
2

いくつかのテーブルを結合しようとすると、エンティティフレームワークがテーブル全体を返すようです。このテーブルはかなり大きいので、必要な行だけを返す必要があります。エンティティフレームワークがテーブル全体を返すSQLを生成しています

Project  - ProjectID, ProjectName 
ProjectEmail - ProjectEmailID, ProjectID, EmailID, RemovedFlag, CreatedBy 
Email   - EmailID, Subject, Body 

私は特定のプロジェクトのための電子メールのデータを取得しようとしています:

私は3つのテーブルを持っています。私はこれを行うと :2番目のクエリは、この生成していることを除いて

exec sp_executesql N'SELECT TOP (1) 
[Extent1].[ProjectID] AS [ProjectID], 
[Extent1].[ProjectName] AS [ProjectName], 
    -- rest of columns appear here 
FROM [dbo].[Project] AS [Extent1] 
WHERE [Extent1].[ProjectID] = @p__linq__0',N'@p__linq__0 int',@p__linq__0=6 

優れ、::

SELECT [Extent1].[EmailID] AS [EmailID], 
    [Extent1].[Subject] AS [Subject], 
      -- rest of columns appear here 
FROM [dbo].[Email] AS [Extent1] 

メールを大きなテーブルで

using (DatabaseEntities context = new DatabaseEntities()) 
{ 
    Project proj = context.Projects.Where(p => p.ProjectID == ProjectID).FirstOrDefault(); 
    if (proj != null) 
    { 
     List<Email> projectEmails = (from pe in proj.ProjectEmails 
            join e in context.Emails on pe.EmailID equals e.EmailID 
            select e).ToList(); 
    } 

} 

生成されるSQLはこれです私は本当にテーブル全体を引き戻したくありません! メールが正しい場合は、 が正しいキーに結合されるようにリストを返す良い方法はありますか?

ProjectYmailテーブルで最初の または2番目のクエリが表示されないため、どの電子メールが返されるかはわかりません。

+0

作成したテーブル定義、作成したEFクエリ、および生成されたSQLの間に切断があるようです。電子メールテーブルにEmailID、Subject、Bodyが含まれていて、クエリがテーブル全体を返しますが、SQLはEmailIDと未記述のHtmlFlagを超えています。心が明らかに? –

+0

申し訳ありません、Anthony、私は読みやすさのためにすべてを短縮しました。そこにはもっと多くの列があります。私は不必要な列を削除しました。 – Rocklan

答えて

4

クエリでwhere条件が見つかりませんでした。

List<Email> projectEmails = (from pe in proj.ProjectEmails 
          join e in context.Emails on pe.EmailID equals e.EmailID 
          where pe.ProjectID == proj.ProjectID 
          select e).ToList(); 

編集

あなたはproj.ProjectEmailsは、IEnumerableを型であるfrom pe in proj.ProjectEmailsを使用しています。したがって、このLINQクエリはLINQからオブジェクトへのクエリになります。そのため、すべてのメールをcontext.Emailsに読み込みます。 Try

List<Email> projectEmails = (from pe in context.ProjectEmails 
          join e in context.Emails on pe.EmailID equals e.EmailID 
          where pe.ProjectID == proj.ProjectID 
          select e).ToList(); 
+0

非常に近いですが、そうではありません。 「proj」にはすでに必要なProjectEmailsしか含まれていないので、そのテーブルをEmailテーブルに追加するとうまくいきます。クエリは実際に正しいデータを返しているので、実際にどのように動作するかはわかりません。 – Rocklan

+0

それは理にかなっています!私はpe.ProjectID = proj.ProjectID ...を追加しました。そして、今は2つのクエリを生成しています。あなたは笑っています。最初のものはEmailテーブル全体をプルバックし、2番目のテーブルはProjectEmailテーブルをクエリします。私はこのエンティティフレームワークが初めてです、私はナビゲーションプロパティについて何も知らない。私はこれを正しい方法でやっていますか? – Rocklan

+0

@ LachlanB編集した回答を確認してください。 – Eranga

関連する問題