Tôi đang sử dụng API DBContext
từ EF 4.1. xem xét theo mô hình thực thể (A, B, E, D là các đơn vị)Cách kết hợp tham gia bên trong và bên trái tham gia vào Khung thực thể
A: AID
B: viện trợ, CID
E: Eid, viện trợ
D: Eid, CID , dữ liệu
Những gì tôi muốn là tương đương dưới đây truy vấn sql
SELECT
B.aId,
B.cId,
COALESCE(M.Data, [default value])
FROM
B LEFT OUTER JOIN
(
SELECT
E.aId,
D.cId,
D.Data
FROM
E INNER JOIN D ON E.eId = D.eId
) M
ON B.aId = M.aId AND B.cId = M.cId
Đơn giản của nó để có tham gia trái vào B, E & D nhưng tôi thấy rằng tôi không thể giải quyết câu hỏi trên. Tôi đã cố gắng dạng LINQ về những gì tôi nghĩ sẽ là một truy vấn tương đương
// inner join equivalent
var ee = db.E.Join(db.D, e => e.eId, d => d.eId,
(e, d) => new { e.aId, e.eId, d.cId, d.Data });
// left outer join
var o = from c in db.B
join e in ee on new { c.aId, c.cId }
equals new { e.aId, e.cId } into temp
from m in temp.DefaultIfEmpty()
select new
{
c.aId,
c.cId,
Data = null != m ? m.Data : [default value]
};
Tuy nhiên, điều này không khi tôi gọi o.ToString()
với các chi tiết ngoại lệ sau đây:
System.ArgumentException: Đối số cho DbIsNullExpression phải tham chiếu đến kiểu nguyên thủy hoặc tham chiếu. tại System.Data.Common.CommandTrees.ExpressionBuilder.Internal.ArgumentValidation.ValidateIsNull (DbExpression luận, Boolean allowRowType) tại System.Data.Objects.ELinq.ExpressionConverter.EqualsTranslator.CreateIsNullExpression (ExpressionConverter mẹ, Expression đầu vào) tại System.Data.Objects.ELinq.ExpressionConverter.EqualsTranslator.TypedTranslate (ExpressionConverter phụ huynh, BinaryExpression LINQ) tại System.Data.Objects.ELinq.ExpressionConverter.TypedTranslator`1.Translate (ExpressionConverter mẹ, Expression LINQ)
... [dấu vết ngăn xếp khác ở đây]
tại System.Data.Objects.ELinq.ExpressionConverter.TranslateExpression (Biểu LINQ) tại System.Data.Objects.ELinq.ExpressionConverter.Convert()
tại System.Data.Objects.ELinq.ELinqQueryState.GetExecutionPlan (Nullable1 forMergeOption) at System.Data.Objects.ObjectQuery.ToTraceString() at System.Data.Entity.Internal.Linq.InternalQuery
1.ToString() tại System.Data.Entity.Infrastructure.DbQuery`1.ToString()
tôi đã cố gắng để tạo truy vấn tương tự sử dụng phương pháp khuyến nông nhưng có cùng một ngoại lệ. Tôi đang thiếu gì ở đây?
--------------------------------------------- ------------------------------------
EDIT:
Nó xuất hiện vấn đề đó là do dòng
Data = null != m ? m.Data : [default value]
tôi đã sửa đổi nó để
Data = m
Và nó bắt đầu hoạt động. Tôi phải di chuyển logic kiểm tra null tại nơi tôi đang sử dụng kết quả. Bây giờ, tôi tự hỏi điều gì có thể là nguyên nhân của ngoại lệ? Từ các chi tiết ngoại lệ, có vẻ như nó không thể tìm ra m (là một kiểu ẩn danh) làm kiểu tham chiếu. Hành vi này có được ghi lại ở đâu đó không?
có thời gian để xem lại kịch bản này để kiểm tra! – VinayC