Accessing custom objects in DomainService from client
我正在使用域服务从 Silverlight 客户端的数据库中获取数据。
在 DomainService1.cs 中,我添加了以下内容:
1 2 3 4 5 6 7 | [EnableClientAccess()] public class Product { public int productID; public string productName; public List<Part> Parts = new List<Part>(); //Part is already present in Model designer } |
在 DomainService1 类中,我添加了一个新方法来检索自定义类对象的集合:
1 2 3 4 5 6 7 8 9 10 11 | [EnableClientAccess()] public class DomainService1 : LinqToEntitiesDomainService<HELPERDBNEWEntities1> { ... public List<Product> GetProductsList(...) { List<Product> resultProducts = new List<Product>(); ... return resultProducts; } } |
我正在尝试从 silverlight 客户端访问该方法:
1 2 3 |
但是调用新方法不是正确的方法。我在 DomainServices.cs 中添加新类 Product 的原因是为了进行有效的分组。我无法使用实体框架自动生成的模型类来实现同样的效果。
如何从客户端调用新方法?
虽然我不知道您所说的"这不是调用新方法的正确方法"是什么意思,或者如果您遇到任何错误,我认为发布一些工作代码可能会有所帮助。
我的POCO
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | public class GraphPointWithMeta { [Key] public Guid PK { get; set; } public string SeriesName { get; set; } public string EntityName { get; set; } public double Amount { get; set; } public GraphPointWithMeta(string seriesName, string entityName, double amount) { PK = Guid.NewGuid(); SeriesName = seriesName; EntityName = entityName; Amount = amount; } // Default ctor required. public GraphPointWithMeta() { PK = Guid.NewGuid(); } } |
领域服务中的一个方法(EnableClientAccess装饰类)
1 2 3 4 5 6 | public IEnumerable<GraphPointWithMeta> CallingActivityByCommercial() { List<GraphPointWithMeta> gps = new List<GraphPointWithMeta>(); // ... return gps; } |
从 Silverlight 客户端调用,例如
1 | ctx1.Load(ctx1.CallingActivityByCommercialQuery(), CallingActivityCompleted, null); |
客户端回调方法
1 2 3 4 | private void CallingActivityCompleted(LoadOperation<GraphPointWithMeta> lo) { // lo.Entities is an IEnumerable<GraphPointWithMeta> } |
我相信这里有一个类似的问题有答案:
DomainService 可以返回单个自定义类型吗?
另外,这里是关于在域服务中添加自定义方法的整体问题的一些讨论:
http://forums.silverlight.net/t/159292.aspx/1
我不确定您的 Product 类是否是实际实体。从它的定义方式来看,它似乎不是一个实体。我的回答是假设它不是一个实体。您将需要为您的产品属性应用 DataMemberAttribute,并且您不会加载产品列表 - 加载用于实体查询(服务端的 IQueryable)。您只需像这样调用它(客户端):
1 2 3 4 5 | void GetProductList( Action<InvokeOperation<List<Product>>> callback) { DomainService ds1 = new DomainService(); ds1.GetProductsList(callback, null);//invoke operation call } |
域服务的(服务器端)方法需要 InvokeAttribute,看起来像这样:
1 2 3 4 5 6 7 8 9 10 11 | [EnableClientAccess] public class MyDomainService { [Invoke] public List<Product> GetProductList() { var list = new List<Product>(); ... return list; } } |
下面是如何定义您的 Product 类(如果它不是实体):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | public class Product { [DataMember] public int productID; [DataMember] public string productName; [DataMember] public List<Part> Parts = new List<Part>(); // you might have some trouble here. //not sure if any other attributes are needed for Parts, //since you said this is an entity; also not sure if you //can even have a list of entities or it needs to be an //entity collection or what it needs to be. You might //have to make two separate calls - one to get the products //and then one to get the parts. } |
就像我说的,我不确定 Product 继承自什么...希望这会有所帮助。