2009-04-01 45 views
9

Làm cách nào để báo cho bối cảnh dữ liệu LINQ bỏ qua thuộc tính cụ thể hoặc tất cả thuộc tính chỉ đọc khi gắn kết kết quả được đặt thành đối tượng?Bỏ qua thuộc tính lớp chỉ đọc khi sử dụng DataContext.ExecuteQuery <T>

Tôi đang làm việc với một số câu lệnh T-SQL khó thể hiện bằng LINQ, vì vậy tôi đang sử dụng phương thức ExecuteQuery của ngữ cảnh dữ liệu để truyền T-SQL thẳng tới cơ sở dữ liệu.

Nếu lớp T của tôi có bất kỳ thuộc tính chỉ đọc nào, tôi có ngoại lệ khi chạy khi ngữ cảnh dữ liệu cố đặt các thuộc tính đó và không thành công vì không có thuộc tính setter. Làm cách nào để tôi nói ngữ cảnh bỏ qua các thuộc tính đó?

Đây là những gì tôi đang làm bây giờ. Nó hoạt động, nhưng nó hút:

public bool IsPaidInFull { 
    get { return NetTotal <= 0m; } 
    set { /* needed so linq doesn't choke. Should never be set by hand */ } 
} 
+0

Tôi có thể là người đầu tiên đề xuất - "không _do_ đó" không? –

+1

Đừng làm gì, chính xác? Cách giải quyết là một tội lỗi, và là không thể chấp nhận được, do đó bài viết của tôi ở đây. Nếu bạn có nghĩa là "không tìm cách bỏ qua các thuộc tính nhất định khi liên kết với tập kết quả", bạn có thể giải thích? –

Trả lời

0

Bạn đã xem LINQ to Entities chưa? Nó có thể không có giá trị khó khăn để chuyển đổi dự án của bạn, tùy thuộc vào cách xa bạn đang có, hoặc bao nhiêu orm overhead bạn cảm thấy thoải mái. Tuy nhiên, kịch bản chính xác này sẽ không phải là một vấn đề trong LINQ to Entities. Nó không cố gắng cập nhật các thuộc tính chỉ đọc trong đối tượng khi tải nó, vì chúng không được ánh xạ một cách rõ ràng, chúng đơn giản là các thuộc tính mở rộng.

Ngoài ra, bạn có thể sử dụng tuyến đường cũ/java bằng cách sử dụng hàm getter thay vì thuộc tính. public bool getIsPaidInFull() {return NetTotal < = 0m;}.

Hoặc bạn có thể chơi xung quanh với việc triển khai thuộc tính chỉ đọc trong lớp con kế thừa, nhưng điều đó có thể giới thiệu tất cả các loại vấn đề.

+0

Đó không phải là một giải pháp có thể cho dự án này, thật không may, nhưng cảm ơn cho tip. Tôi nghĩ chúng ta có thể xem xét một ORM đầy đủ trong tương lai; L2S rất tuyệt vời như một trình bao bọc đơn giản trên mô hình dữ liệu, nhưng nó có thể gây đau đớn khi sử dụng nó như một lớp ánh xạ tới các thực thể. Tôi chấp nhận đề xuất "trường học cũ" của bạn làm câu trả lời. Tôi dường như không thể tìm thấy một giải pháp tốt hơn, và phương pháp getter tốt hơn so với cách giải quyết hiện tại của tôi. –

1
public bool IsPaidInFull 
{ 
    get { return NetTotal <= 0m; } 
    private set { ;} 
} 
+0

Đây là điều xấu ... –

+0

Nó phải có một cái gì đó để làm với sự phản ánh được sử dụng bởi các datacontext. Tôi tưởng tượng datacontext sử dụng sự phản chiếu để kiểm tra xem liệu có một getter và setter trên thuộc tính của bạn, nhưng không kiểm tra công cụ sửa đổi truy cập. Và sau đó vì nó không bao giờ thực sự sử dụng setter, không có bất kỳ vấn đề với truy cập. – AndyClaw

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