5

我创建了一个包含 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 对象?

4

5 回答 5

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

希望这有效!

于 2008-11-04T03:34:17.403 回答
2

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

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

于 2008-11-04T01:39:14.983 回答
1

客户端类是什么类型?

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

于 2008-11-03T23:35:56.513 回答
1

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

SELECT col1, col2, col3, LastName CASE LastName WHEN 'Washington' THEN 1 ELSE 0 AS IsWashington FROM Client

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

于 2008-11-05T19:33:28.810 回答
1

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

于 2008-12-20T05:39:34.287 回答