2

アプリケーションにEntityFramework4モデルがあります。次のSQLを生成するために必要です。

SELECT *
FROM       Reads            AS R
INNER JOIN Images           AS I ON R.ReadId = I.ReadId AND I.ImageTypeId = 2
LEFT OUTER JOIN Alarms      AS A ON R.ReadId = A.ReadId AND A.DomainId IN (103,102,101,2,1,12) AND A.i_active = 1
LEFT OUTER JOIN ListDetails AS L ON L.ListDetailId = A.ListDetailId
WHERE R.i_active = 1

これが私のコードのこのクエリに対して私が今持っているものです:

var items = from read  in query
            join plate in context.Images      on read.ReadId        equals plate.ReadId
            join temp1 in context.Alarms      on read.ReadId        equals temp1.ReadId       into alarms  from alarm in  alarms.DefaultIfEmpty()
            join temp2 in context.ListDetails on alarm.ListDetailId equals temp2.ListDetailId into entries from entry in entries.DefaultIfEmpty()
            where plate.ImageTypeId == 2 && plate.IActive == 1
            select new { read, plate, alarm, entry.OfficerNotes };

Entity Frameworkクエリを変更して、必要なSQLクエリを取得するにはどうすればよいですか?

4

1 に答える 1

2

from左結合の場合-のwhere代わりにを使用することをお勧めしjoinます。

複数の結合条件を持つ内部結合の場合-2つの一致する匿名型で結合するか、fromwithwhere条件を使用する必要があります

x INリストの場合、クエリの外部でリストを指定し、AnyメソッドまたはContainsメソッドを使用する必要があります

List<int> domainIds = new List<int>() { 103,102,101,2,1,12 };

    var items = from read  in query
                join plate in context.Images
                on new { read.ReadId, ImageTypeId = 2 } equals new { plate.ReadId, plate.ImageTypeId }
                from alarm in context.Alarms
                                     .Where(x => x.IActive == 1)
                                     .Where(x => domainIds.Any(y => y == x.DomainId))
                                     .Where(x => read.ReadId == x.ReadId)
                                     .DefaultIfEmpty()
                from entry in context.ListDetails 
                                     .Where(x => alarm.ListDetailId == x.ListDetailId)
                                     .DefaultIfEmpty()
                select new { read, plate, alarm, entry.OfficerNotes };
于 2012-07-20T14:38:27.277 に答える