我一直在网上寻找解决我的问题的方法,但我没有运气。我正在开发一个Silverlight商务类应用程序并尝试使用RIA服务。我成功加载和保存实体没有任何重大问题,但是当我的应用程序首次加载时,我需要加载我称之为“值列表”的内容。
我的值列表是独立的实体,可能是5个左右,由Id(键)和Value组成,它们用于填充组合框和自动填充框等内容。我可以单独查询每个值,但是我宁愿在一个查询中一次加载所有值列表以加快速度,因为每个值少于15条记录。我尝试开发一个自定义类来返回它们,它看起来像这样......
<DataContract(IsReference:=True)>
<KnownType(GetType(ValueList1Item))>
<KnownType(GetType(ValueList2Item))>
<KnownType(GetType(ValueList3Item))>
Partial Public Class ValueLists
<DataMember()>
Public Property ValueList1 AS List(Of ValueList1Item)
<DataMember()>
Public Property ValueList2 AS List(Of ValueList2Item)
<DataMember()>
Public Property ValueList3 AS List(Of ValueList3Item)
End Class
我已经尝试了很多方法来实现服务方法,其中一种看起来像这样......
Public Function GetValueLists() As ValueLists
Dim ret As ValueLists = New ValueLists
ret.ValueList1 = (From v1 In ObjectContext.ValueList1Items
Select v1).ToList
ret.ValueList2 = (From v2 In ObjectContext.ValueList1Items
Select v2).ToList
ret.ValueList3 = (From v3 In ObjectContext.ValueList3Items
Select v3).ToList
Return ret
End Function
我也尝试过返回IQueryable(Of ValueLists)。无论我尝试过什么,每当我尝试使用自定义类型时,它都无法将方法暴露给客户端。甚至可以通过RIA服务做这样的事情还是尚未成熟?我知道我过去用直接的WCF做过这个,但显然更多的工作。
提前致谢, 凯西
答案 0 :(得分:0)
(抱歉我的英语不好)
我以前试过这个,但它确实不起作用。如果您为ValueList1
创建新类,则可以正常工作。但是,如果您使用具有[Key]
属性的类,由于某种原因,它不会生成(该属性不会出现在客户端)。因此,一种解决方案是创建类似ReadOnlyValueList1的类并返回它:
ret.ValueList1 = (from v1 In ObjectContext.ValueList1Items
select new ReadOnlyValueList1()
{
Prop1 = v1.Prop1,
Prop2 = v1.Prop2,
}).ToList();
(对不起,C#代码,可能这在VB中有点不同)
无论如何它是有道理的,因为你不希望所有的EF东西(跟踪等)只是绑定一些列表和组合。
答案 1 :(得分:0)
您应该可以毫无问题地执行此操作,但在将对象传递给RIA服务客户端时,需要指定[Key],保证在所有类似对象之间保持唯一。这是由于RIA服务处理客户端缓存这些对象的方式。此外,您的ValueList1Item,ValueList2Item等需要可序列化。
当以这种方式设置时,RIA服务将使您的服务器POCO对象成为客户端实体对象。您将遇到的唯一问题是您必须手动处理任何CUD操作。如果它是您传入客户端的只读数据,则无需担心。
答案 2 :(得分:0)
好吧,我已经设法更近了一点。将键添加到返回对象的Id属性至少使它成功编译,但是使用fiddler查看结果我可以看到对象中没有任何内容。我猜这是一种序列化问题。
我从我的模型生成的另一个实体类的副本构造了我的返回对象(dto),以确保我没有遗漏任何东西。然后我注释掉了所有的更改跟踪,以确保它没有造成任何问题。这是班级:
<DataContract(IsReference:=True)> _
<KnownType(GetType(ValueList1Item))> _
<KnownType(GetType(ValueList2Item))> _
Partial Public Class ValueLists
#Region "Primitive Properties"
<DataMember()> _
<Key()> _
Public Property Id() As Long
Get
Return _id
End Get
Set(ByVal value As Long)
If Not Equals(_id, value) Then
_id = value
End If
End Set
End Property
Private _id As Long
<DataMember()> _
Public Property ValueList1() As List(Of ValueList1Item)
Get
Return _valueList1
End Get
Set(ByVal value As List(Of ValueList1Item))
If Not Equals(_valueList1, value) Then
_valueList1 = value
End If
End Set
End Property
Private _valueList1 As List(Of ValueList1Item)
<DataMember()> _
Public Property ValueList2() As List(Of ValueList2Item)
Get
Return _valueList2
End Get
Set(ByVal value As List(Of ValueList2Item))
If Not Equals(_valueList2, value) Then
_valueList2 = value
End If
End Set
End Property
Private _valueList2 As List(Of ValueList2Item)
#End Region
End Class
我用来构造和返回对象的方法看起来像这样......
Public Function GetValueLists() As ValueLists
Dim ret As ValueLists = New ValueLists
ret.Id = RandomNumber(1, 100000000)
ret.ValueList1 = (From vli1 In ObjectContext.ValueList1Items
Select vli1).ToList()
ret.ValueList2 = (From vli2 In ObjectContext.ValueList2Items
Select vli2).ToList()
Return ret
End Function
跟踪此方法表明它实际上工作正常。我可以看到所有值列表项都已正确填充,它只是永远不会离开服务器。这让我相信这是某种序列化问题。