【问题标题】:How do I extend ADO.NET Entity Framework objects with partial classes?如何使用部分类扩展 ADO.NET Entity Framework 对象?
【发布时间】:2010-09-20 14:06:36
【问题描述】:

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

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

1个班级窗口1 2 3 私有子窗口1_Loaded(_ 4 ByVal 发送者作为 System.Object, _ 5 ByVal e 作为 System.Windows.RoutedEventArgs) _ 6 句柄 MyBase.Loaded 7 8 Dim dc 作为新的 ToyEntities1 9 Label1.Content =(来自 c 作为客户端在 dc.ClientSet _ 10 选择 c).First.FirstName 11 12 结束子 13 14 结束类

运行良好。

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

1 部分公开课客户端 2 函数 IsWashington() 作为布尔值 3 Return Me.LastName = "华盛顿" 4 结束功能 5 结束类

...并将 WHERE 子句添加到我的 Window1.xaml.vb 查询...

9 Label1.Content =(来自 c 作为客户端在 dc.ClientSet _ 10 在哪里 c.IsWashington _ 11 选择 c).First.FirstName

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

LINQ to Entities 无法识别方法 'Boolean IsWashington()' 方法,并且该方法无法转换为存储表达式。

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

【问题讨论】:

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


    【解决方案1】:

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

    我不知道 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
    

    希望这行得通!

    【讨论】:

    • 您可以在此处找到一篇博客文章,其中包含对该问题的详细说明:blog.genom-e.com/…
    【解决方案2】:

    问题是您正在编写代码,并期望实体框架将其转换为 SQL……它不能这样做。就像 LINQ to SQL 不能那样做。

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

    【讨论】:

    • 我希望这听起来不太刺耳......我应该说的是,一旦你查询的是“本地”,你可以添加你的 where 子句(但那是 LINQ to Objects - 和这是本地的,而不是数据库级别的)。
    【解决方案3】:

    Client 类是什么类型?

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

    【讨论】:

    • 我的回答有什么问题?你是如何解决这个问题的?谢谢。
    【解决方案4】:

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

    选择 col1、col2、col3、姓氏 案例姓氏 当'华盛顿'然后 1 ELSE 0 作为华盛顿 来自客户

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

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-01-31
        • 1970-01-01
        • 2014-11-07
        • 2011-07-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多