Tôi đang có một thời gian heckuva tìm ra cách dịch một SQL LEFT OUTER JOIN đơn giản với hai điều kiện mà mệnh đề vào một truy vấn LINQ-to-Entities đang hoạt động . Chỉ có hai bảng. Tôi cần các giá trị cho tất cả các hàng từ Table1, bất kể các đối sánh trong Table2, nhưng mệnh đề WHERE sử dụng các trường từ Table2. Trong SQL, hai tham số sẽ Table2WhereColumn1 và Table2WhereColumn2, và truy vấn (mà hoạt động) trông như thế này:LINQ-to-Entities: LEFT OUTER JOIN với mệnh đề WHERE và chiếu
SELECT t1.Table1Id,
t1.FieldDescription,
t2.FieldValue
FROM Table1 t1 WITH (NOLOCK)
LEFT JOIN Table2 t2 WITH (NOLOCK) ON t1.Table1Id = t2.Table1Id
WHERE (t2.Table2WhereColumn1 = @someId OR t2.Table2WhereColumn1 IS NULL)
AND (t2.Table2WhereColumn2 = @someOtherId OR t2.Table2WhereColumn2 IS NULL)
ORDER BY t1.OrderByColumn
Tôi đã cố gắng sử dụng Group Join
với DefaultIfEmpty()
, cũng như tiềm ẩn tham gia (không có thực tế Join
từ khóa) và tôi chỉ nhận được các hàng cho các mục có giá trị trong Bảng 2. Tôi chắc chắn điều này sẽ không giúp đỡ, nhưng đây là một ví dụ về Linq Tôi đã cố gắng mà không hoạt động:
Public Shared Function GetProfilePreferencesForCedent(ByVal dc As EntityContext, _
ByVal where1 As Int32, _
ByVal where2 As Int32) _
As IQueryable(Of ProjectedEntity)
Return From t1 In dc.Table1
Group Join t2 In dc.Table2 _
On t1.Table1Id Equals t2.Table1Id _
Into t2g1 = Group _
From t2gx In t2g1.DefaultIfEmpty(Nothing)
Where (t2gx.Table2Where1 = where1 Or t2gx.Table2Where1 = Nothing) _
And (t2gx.Table2Where2 = where2 Or t2gx.Table2Where2 = Nothing)
Order By t1.SortOrder
Select New ProjectedEntity With {
.Table1Id = t1.Table1Id, _
.FieldDescription = t1.FieldDescription, _
.FieldValue = If(t2gx Is Nothing, String.Empty, t2gx.FieldValue) _
}
End Function
nổi bật! Làm việc như một say mê. Tôi không chắc tôi hiểu cách mệnh đề Where hoạt động, nhưng nó hoạt động. –