我创建了一个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对象?
答案 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是正确的,您需要在扩展类周围添加命名空间以匹配生成的命名空间。