2015-01-24 17 views
7

Tôi có lược đồ cơ sở dữ liệu với giáo viên, trường học và các huyện. Bảng TEACHERS có cột số SCHOOL_ID có thể vô hiệu hóa (một giáo viên có thể hoặc không thuộc về một trường) và bảng SCHOOLS có cột vô giá trị DISTRICT_ID (một trường có thể hoặc không thể thuộc về một học khu).Không thể viết hai bên trái tham gia bằng Esqueleto

Sử dụng Esqueleto, tôi muốn danh sách giáo viên, mỗi giáo viên có một trường (nếu họ thuộc về một) và một học khu (nếu họ thuộc về một trường thuộc về một học khu). Phải mất một chút thời gian để tìm ra các biểu hiện đúng chỉ cho teacher-> trường trái tham gia, nhưng tôi cuối cùng đã nhận nó đúng:

select $ 
from $ \(teacher `LeftOuterJoin` school) -> do 
    on (teacher ^. TeacherSchoolId ==. school ?. SchoolId) 
    return (teacher, school) 

Tôi đã thử thêm trái khác tham gia vào DISTRICTS sử dụng một biểu thức tương tự:

select $ 
from $ \(teacher `LeftOuterJoin` school `LeftOuterJoin` district) -> do 
    on (school ^. SchoolDistrictId ==. district ?. DistrictId) 
    on (teacher ^. TeacherSchoolId ==. school ?. SchoolId) 
    return (teacher, school, district) 

Nhưng tôi nhận được một lỗi:

Couldn't match type ‘Entity School’ with ‘Maybe (Entity School)’ 
Expected type: SqlExpr (Maybe (Entity School)) 
    Actual type: SqlExpr (Entity School) 
In the first argument of ‘(?.)’, namely ‘school’ 
In the second argument of ‘(==.)’, namely ‘school ?. SchoolId’ 

thể đôi này tham gia được thể hiện bằng Esqueleto? Nếu vậy, làm thế nào?

+0

Tôi không biết thư viện này, và tất cả có vẻ phức tạp, nhưng có vẻ như bạn cần phải nâng một số nội dung 'Có thể' để đồng bộ hóa với nội dung SQL. Hoặc đường vòng khác. Tôi không biết. – dfeuer

Trả lời

1

Hãy thử thay đổi

on (teacher ^. TeacherSchoolId ==. school ?. SchoolId) 

Để

on (teacher ^. TeacherSchoolId ==. just (school ?. SchoolId)) 

Nếu điều đó không làm việc, cái tát 'chỉ' trên các thành phần khác của biểu thức truy vấn cho đến khi nó hoạt động.

tham khảo: sử dụng Esqueleto thời gian gần đây trên một dự án thương mại

Update, 2016/10/26:

Gần đây tôi đã gặp phải vấn đề này. Tôi nghĩ rằng đó là một vấn đề serialization liên tục tương tác với Esqueleto sẵn sàng giả vờ tham gia không tạo ra kết quả nullable.

thời gian gần đây tôi đã thay đổi một mảnh của một truy vấn từ:

person `LeftOuterJoin` 
    personExtra 
) -> do 
    on ((personExtra ^. PersonExtraPerson) ==. (person ^. PersonId)) 

tới:

person `LeftOuterJoin` 
    personExtra 
) -> do 
    on ((personExtra ?. PersonExtraPerson) ==. just (person ^. PersonId)) 

Tôi cũng đã thay đổi kiểu trả về của truy vấn của tôi Entity PersonExtra-Maybe (Entity PersonExtra).

Hiện tại, Persistent hy vọng khả năng là PersistNull và truy vấn hoạt động tốt cho tôi.

+0

Tôi đã thử tất cả mười sáu kết hợp có và không có 'chỉ' xung quanh mỗi trong bốn đối số cho hai toán tử' ==. '. Không ai trong số họ kết quả trong mã compilable. – Sean

+0

@Sean có gì với '? .'? – bitemyapp

+0

Đó là "để chiếu một trường từ Có thể (Entity a)" theo tài liệu Esqueleto. – Sean

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