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

如何使用分部类扩展ADO.NET实体框架对象?,.net,vb.net,linq,entity-framework,linq-to-entities,.net,Vb.net,Linq,Entity Framework,Linq To Entities,我创建了一个Visual Basic WPF应用程序项目,其中包含Toy.edmx,这是一个ADO.NET实体数据模型,由名为Toy的数据库生成 其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)

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

其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 1类窗口1 2. 3个专用子窗口1_已加载(_ 4 ByVal发送方作为System.Object_ 5字节e As System.Windows.RoutedEventArgs)_ 6个句柄MyBase。已加载 7. 8 Dim dc作为新实体1 9 Label1.Content=(从c作为dc.ClientSet中的客户机_ 10选择c).First.FirstName 11 12端接头 13 14末班 运行得很好

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

1部分公共类客户端 2函数IsWashington()作为布尔值 3返回我。LastName=“华盛顿” 4端功能 5末班 …并将WHERE子句添加到我的Window1.xaml.vb查询中

9 Label1.Content=(从c作为dc.ClientSet中的客户机_ 华盛顿在哪里_ 11选择c).First.FirstName …然后我得到这个NotSupportedException:

LINQ to Entities无法识别方法“Boolean IsWashington()”方法,并且无法将此方法转换为存储表达式


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

什么类型的客户端类


您可能需要将名称空间(与定义客户端“实体类”的名称空间相同)添加到包含“IsWashington”的文件中。

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


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

这就是您要做的-创建一个方法,将筛选器应用于客户端查询

我不懂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

希望这能奏效

您可以通过从视图馈送客户端对象来解决这个特定问题。使用SQL CASE语句设置位列值:

选择col1、col2、col3、LastName 案例姓氏 “华盛顿”什么时候开始 华盛顿也一样 来自客户


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

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

我希望这听起来不太刺耳。。。我要说的是,一旦你的查询是“本地”的,你就可以添加你的where子句(但那是LINQ to Objects-那是本地的,而不是DB级别的)。你可以在这里找到一篇博客文章,对这个问题有相当详细的解释:我的答案有什么问题?你是如何解决这个问题的?谢谢
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