2010-07-05 37 views
7

Tôi có truy vấn LINQ bên dưới có một trường văn bản có thể là Y, N hoặc DBnull và điền một boolean? tham số với True, False hoặc null tùy thuộc vào giá trị của trường.C# sử dụng LINQ và Nullable Boolean

var dset = from i in tbdc.Talkbacks 
     where i.talkback_id == id 
     select new Talkback(
       i.talkback_id, i.acad_period, i.reference, 
       i.staff_member, i.date_received, i.no_talkers, 
       i.gender_id, i.names, i.type_id, 
       i.method_id, i.area_id, i.site_id, 
       i.category_id, i.date_closed, i.expenddate, 
       i.acknowledgementtarget, 
       (i.targetmet == "Y") ? true : 
        ((i.targetmet == "N") ? false : null), 
        (i.acknowledgementtargetmet != "N") ? true : false 

Dòng vấn đề là

(i.targetmet == "Y") ? true : ((i.targetmet == "N") ? false : null) 

Sau khi đọc lên tôi thấy một số tài liệu trong đó nêu rằng 2 và 3 đối số của inline nếu cần phải cùng loại hoặc được ngầm chuyển đổi thành một khác.

Câu hỏi của tôi là, làm cách nào để vượt qua giới hạn này để đạt được kết quả mong muốn?

Tôi tương đối mới đối với C# nên chưa quen với tất cả các tính năng/khả năng của nó.

Trả lời

6

Đề nghị của tôi sẽ được thay thế bằng:

(i.targetmet != null) ? (bool?)(i.targetmet == "Y") : null; 

lý do tại sao các trình biên dịch không đồng ý mà không diễn viên là ngay cả khi bạn lưu trữ nó vào một cấu trúc nullable, các hoạt động ternary kiểm tra nếu kết quả tương thích thông qua một chuyển đổi tiềm ẩn.

Kết quả truefalse được coi là bool literals, không bool?, do đó không ngầm mui trần để null. Việc đưa các kết quả vào bool? sẽ làm cho chúng có thể so sánh được. Người tôi đề nghị có một chuyển đổi ngầm giữa bool?null, và các công trình này quá:

(i.targetmet != null) ? (i.targetmet == "Y") : (bool?)null; 

Đó là một chuyển đổi ngầm giữa một boolbool?. Tôi tùy tiện thích người đầu tiên ..

+0

Điều đó đã làm việc tuyệt vời Dynami. Bây giờ tôi đang gặp một vấn đề tiếp tục xuống dòng nơi tôi đang cố gắng sử dụng giá trị trong một DisplayTemplate với mã dưới đây: <% @ Control Language = "C#" Inherits = "System.Web.Mvc.ViewUserControl "%> <%: ((Boolean?) Model.Value == True)? "kpi_tick.png": "kpi_cross.png"%> Ý tưởng là nó sẽ hiển thị một hình ảnh đánh dấu cho đúng, hình ảnh chéo cho sai, và không có hình ảnh cho undefined (chưa thực hiện bit đó của mã) . Tôi nhận được lỗi "Tên" True "không tồn tại trong bối cảnh hiện tại" – hermiod

+2

Đánh dấu này trông giống như ASP.NET, mà tôi đã làm việc với nhiều thời gian gần đây. Vì vậy, bắn ngẫu nhiên trong bóng tối: thay thế đúng với sự thật? –

+0

Tạo một lớp tĩnh gọi là BoolHelper với một phương thức tĩnh bool Parse (chuỗi s) có chứa giải pháp của Dynami. Sau đó, sử dụng điều đó để đơn giản hóa mọi thứ cho trình phân tích cú pháp của bạn. –

2

Bạn rõ ràng có thể chuyển đổi một hoặc nhiều các biểu thức để một bool?:

(i.targetmet == "Y") ? true : ((i.targetmet == "N") ? (bool?)false : (bool?)null) 
Các vấn đề liên quan