2008-11-03 49 views
5

我创建了一个包含Toy.edmx的Visual Basic WPF应用程序项目,这是一个从名为Toy的数据库生成的ADO.NET实体数据模型。如何用部分类扩展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 

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

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

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

LINQ到Entiti es无法识别方法'布尔IsWashington()'方法,并且此方法无法转换为商店表达式。

如何扩展带有部分类的ADO.NET实体框架对象?

回答

2

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

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

+0

我希望听起来不太刺耳......我应该说的是,一旦你查询的是“本地”,你可以添加你的where子句(但这是LINQ到对象 - 这是本地的,而不是在DB水平)。 – 2008-11-04 01:41:50

1

客户端类是什么类型?

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

+0

我的回答有什么问题? 你是如何解决这个问题的? 谢谢。 – shahkalpesh 2008-11-04 22:41:42

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 

希望这个作品!

+0

你可以在这里找到一篇相当详细的问题解释的博客文章:http://blog.genom-e.com/PermaLink,guid,4c486a95-12ad-4abf-aba1-7eb893c91ba7.aspx – csgero 2008-11-04 07:33:42

1

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

SELECT COL1,COL2,COL3,姓氏 CASE姓氏 如果 '华盛顿' THEN 1 ELSE 0 AS IsWashington 从客户

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

1

shahkalpesh是正确的,你需要在你的扩展类中添加命名空间来匹配生成的类。