如何使用分部类扩展ADO.NET实体框架对象?

时间:2008-11-03 22:42:25

标签: .net vb.net linq entity-framework linq-to-entities

我创建了一个Visual Basic WPF应用程序项目,其中包含Toy.edmx,这是一个从名为Toy的数据库生成的ADO.NET实体数据模型。

Window1.xaml.vb 文件如下所示:

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

运行得很好。

但是,如果我添加文件 Client.vb ...

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

...并在我的 Window1.xaml.vb 查询中添加WHERE子句......

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

...然后我得到了这个NotSupportedException:

  

LINQ to Entities无法识别方法'Boolean IsWashington()'方法,并且此方法无法转换为商店表达式。

如何使用分部类扩展ADO.NET Entity Framework对象?

5 个答案:

答案 0 :(得分:3)

这是您要做的 - 创建一个将过滤器应用于客户端查询的方法。

我不知道vb.net,所以不要相信这个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

稍后,一些调用代码。

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

Label1.Content = someQuery.First.FirstName

希望这有效!

答案 1 :(得分:2)

问题在于您正在编写代码,并期望实体框架将其转换为SQL ......它无法做到这一点。就像LINQ to SQL不能那样做。

想象一下,如果您的属性从“C:\”驱动器中读取文件...您认为它会如何处理? - 不可能。

答案 2 :(得分:1)

Client类是什么类型的?

您可能需要将命名空间(与定义Client“Entity classs”的命名空间相同)添加到包含“IsWashington”的文件中。

答案 3 :(得分:1)

您可以通过从View中提供Client对象来解决此特定问题。使用SQL CASE语句设置位列值:

SELECT col1,col2,col3,LastName CASE姓氏  当'华盛顿'那么1  ELSE 0 AS IsWashington 来自客户

如果您使用视图作为客户实体对象的基础,则IsWashington列应该成为该类的成员以及所有其他列。

答案 4 :(得分:1)

shahkalpesh是正确的,您需要在扩展类周围添加命名空间以匹配生成的命名空间。