2008-11-03 23 views
5

Tôi đã tạo một dự án Ứng dụng WPF Visual Basic có chứa Toy.edmx, một Mô hình Dữ liệu Thực thể ADO.NET được tạo từ một cơ sở dữ liệu có tên là Toy.Làm cách nào để mở rộng các đối tượng ADO.NET Entity Framework với các lớp một phần?

Window1.xaml.vb tập tin trông như thế này:

 
1 Class Window1 
2 
3  Private Sub Window1_Loaded(_ 
4  ByVal sender As System.Object, _ 
5  ByVal e As System.Windows.RoutedEventArgs) _ 
6  Handles MyBase.Loaded 
7 
8   Dim dc As New ToyEntities1 
9   Label1.Content = (From c As Client In dc.ClientSet _ 
10       Select c).First.FirstName 
11 
12  End Sub 
13 
14 End Class 

Đó chỉ chạy tốt.

Nhưng, nếu tôi thêm các tập tin Client.vb ...

 
1 Partial Public Class Client 
2  Function IsWashington() As Boolean 
3   Return Me.LastName = "Washington" 
4  End Function 
5 End Class 

... và thêm một mệnh đề WHERE để Window1.xaml.vb truy vấn của tôi ...

 
9   Label1.Content = (From c As Client In dc.ClientSet _ 
10       Where c.IsWashington _ 
11       Select c).First.FirstName 

... sau đó tôi nhận được NotSupportedException này:

LINQ to Entiti es không nhận ra phương thức 'Phương thức Boolean IsWashington()' và phương pháp này không thể được dịch thành biểu thức cửa hàng.

Làm cách nào để mở rộng các đối tượng Khung thực thể ADO.NET với các lớp một phần?

Trả lời

2

Vấn đề là bạn đang viết mã và mong đợi khung thực thể dịch thành SQL ... nó không thể làm điều đó. Cũng giống như LINQ to SQL không thể làm điều đó.

Hãy tưởng tượng nếu thuộc tính của bạn đọc tệp từ ổ "C: \" ... bạn nghĩ nó sẽ xử lý như thế nào? - không thể.

+0

Tôi hy vọng rằng âm thanh không quá khắc nghiệt ... điều tôi nên nói là khi bạn truy vấn là "cục bộ", bạn có thể thêm mệnh đề where (nhưng đó là LINQ to Objects - và đó là local, chứ không phải DB cấp độ). –

1

Loại khách hàng là loại gì?

Bạn có thể cần phải thêm không gian tên (giống như trong đó Khách hàng "Các lớp thực thể" được xác định) vào tệp chứa "IsWashington".

+0

Có gì sai với câu trả lời của tôi? Bạn giải quyết vấn đề như thế nào? Cảm ơn. – shahkalpesh

3

Đây có phải là những gì bạn đang cố gắng làm hay không - tạo một phương pháp áp dụng bộ lọc cho truy vấn Khách hàng.

Tôi không biết vb.net, vì vậy đừng tin vào mã miễn phí này 100%.

Partial Public Class Client 
    Public Shared Function IsWashington(query As IQueryable(Of Client)) As IQueryable(Of Client) 
    Return query.Where(Function(someClient) someClient.LastName = "Washington") 
    End Function 
End Class 

sau đó, một số mã gọi điện.

IQueryable(Of Client) someQuery = dc.ClientSet.AsQueryable 
someQuery = Client.IsWashington(someQuery) 

Label1.Content = someQuery.First.FirstName 

Hy vọng công việc này!

+0

Bạn có thể tìm thấy mục nhập blog có giải thích chi tiết về vấn đề ở đây: http://blog.genom-e.com/PermaLink,guid,4c486a95-12ad-4abf-aba1-7eb893c91ba7.aspx – csgero

1

Bạn có thể giải quyết vấn đề cụ thể này bằng cách cho đối tượng Khách hàng của bạn từ Chế độ xem. Sử dụng các câu lệnh SQL TRƯỜNG HỢP đặt một giá trị cột bit:

CHỌN col1, col2, col3, LastName TRƯỜNG HỢP LastName KHI 'Washington' THEN 1 ELSE 0 AS IsWashington TỪ Khách hàng

Nếu bạn sử dụng xem làm cơ sở cho đối tượng thực thể Khách hàng của bạn, cột IsWashington sẽ trở thành thành viên của lớp cùng với tất cả các cột khác.

1

shahkalpesh là chính xác, bạn cần phải thêm không gian tên xung quanh lớp mở rộng của bạn để khớp với vùng được tạo.

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