6

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 (Nullable 1 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?

Trả lời

2

Bạn đã không kiểm tra thực thể được kết hợp, điều này không có ý nghĩa về mặt sql. Thông tin sau đây cần được hiểu là hợp nhất:

Data = m.Data ?? [default value] 
+0

có thời gian để xem lại kịch bản này để kiểm tra! – VinayC

Các vấn đề liên quan