Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Silverlight 通过RIA服务传递计算值_Silverlight_Wcf Ria Services - Fatal编程技术网

Silverlight 通过RIA服务传递计算值

Silverlight 通过RIA服务传递计算值,silverlight,wcf-ria-services,Silverlight,Wcf Ria Services,我正试图找出一种方法来获得额外的数据,这些数据将与从RIA域服务返回的实体一起传递 例如,假设我想为“订单”显示一个数据网格,并为订单中的总项目包括一列 Order Num. | Cust. Name | *No. of Items Ordered* 4545 | John | 4 1234 | Mike | 7 在服务器端,通过Linq查询,我可以执行以下操作: var query = from o in

我正试图找出一种方法来获得额外的数据,这些数据将与从RIA域服务返回的实体一起传递

例如,假设我想为“订单”显示一个数据网格,并为订单中的总项目包括一列

Order Num.  |  Cust. Name |  *No. of Items Ordered*
4545        |  John       |   4    
1234        |  Mike       |   7
在服务器端,通过Linq查询,我可以执行以下操作:

var query = 
    from o in entities.Orders
    select new OrderWithItemCount { Order = o, ItemCount = o.Items.Count() };
。。。这将一次性检索我的订单和物品数量

问题是,我找不到通过域服务将这些结果传播到Silverlight客户端的方法。我想我可以使用标准的WCF服务,但这有什么乐趣呢

更新

实际问题是什么…


事实上,我曾一度尝试过日产(Nissan)粉丝和Florian Lim指出的“简易方法”。当我尝试的时候,我没有得到所有的数据。(我还需要在查询中包含客户
人员
,以获取他们的姓名。)事实证明,我认为RIA服务的限制实际上是EF 4.0的限制,也就是说
实体.Orders.include(“客户”)
如果您选择的新类型不是
订单
,则不起作用。解决方法是在select语句中显式选择
o.Customer
,EF将自动将所选人员连接到
Order

简易方式:

只需向Order类中添加额外字段(可以在分部类中完成),并将其填充到DomainService中

复杂但更灵活的方式:

将OrderWithItemCount定义为一个实体(需要具有[Key]属性),然后传输该属性

public class OrderWithItemCount
{
    [Key]
    public int Id { get; set; }

    // You need this, so that the DomainContext on the client can put them back together.
    public int OrderId { get; set; }

    [Include]
    [Association("OrderReference", "OrderId", "Id")]
    public Order Order { get; set; }

    public int ItemCount { get; set; }

    public Person Customer { get; set; }
}

public IQueryable<OrderWithItemCount> GetOrdersWithItemCount()
{
    var query = from o in entities.Orders
                select new OrderWithItemCount
                {
                    OrderId = o.Id,
                    Order = o,
                    ItemCount = o.Items.Count,
                    Customer = o.Customer, // Makes sure EF also includes the Customer association.
                };
    return query;
}
公共类OrderWithItemCount
{
[关键]
公共int Id{get;set;}
//您需要这样做,以便客户端上的DomainContext可以将它们重新组合在一起。
公共int-OrderId{get;set;}
[包括]
[关联(“OrderReference”、“OrderId”、“Id”)]
公共秩序{get;set;}
公共int ItemCount{get;set;}
公众客户{get;set;}
}
公共IQueryable GetOrdersWithItemCount()
{
var query=来自实体中的o。订单
选择new OrderWithItemCount
{
OrderId=o.Id,
顺序=o,
ItemCount=o.Items.Count,
Customer=o.Customer,//确保EF还包括客户关联。
};
返回查询;
}

代码中可能有一些小错误,因为我目前无法测试,但我最近实现了类似的功能。

如果您使用LINQ to SQL生成域服务,只需进入Orders的分部类并添加名为NumberOfOrders的属性,该属性返回一个表示计数的Int。该财产将毫无疑问地传递给客户

internal sealed class OrderMetadata
        {
// Metadata classes are not meant to be instantiated.
            private OrderMetadata()
            {
            }

            ... (property stubs auto-generated)
        }

        public int NumberOfOrders
        {
            get { return this.Items.Count; }
        }

您不能按照上面演示的方式执行此操作的原因是,除了conrete类之外,您无法对任何对象进行封送处理(不允许使用任何类)。通过将此属性添加到分部类,它将有效地成为其已发布签名的一部分。

我不知道您可以定义新实体并以这种方式使用它,谢谢!我将提交对代码的编辑,我很乐意将其标记为答案。创建一个全新的实体来实现这一点当然是可行的,但您只需将属性添加到由域服务代理创建的分部类中,或者将其作为分部类添加到LINQ to SQL/EF中,就可以更快地到达预定目标。见下文。@Nissan Fan:同意,事实上,这就是我使用真实代码的方式。我认为Florian的回答是正确的,因为他在你之前几分钟就发布了,还包括了关于创建新实体的信息,这在更复杂的情况下可能会派上用场。您的回答也是正确的,非常感谢!