代码之家  ›  专栏  ›  技术社区  ›  John

如何向WCF数据服务添加简单计数

  •  0
  • John  · 技术社区  · 12 年前

    我设置了一个简单的WCF数据服务。我选择了Linq到SQL的解决方案。

    public class MyDataService : DataService<SomeDataContext>
    {
            public static void InitializeService(DataServiceConfiguration config)
            {
                config.SetEntitySetAccessRule("*", EntitySetRights.AllRead);
                config.SetEntitySetPageSize("*", 20);
                config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V3;
            }
    

    由于我使用的是Linq,我不得不为键添加分部类

    [DataServiceKey("MessageId")]
    public partial class Message
    {
    }
    
    [DataServiceKey("UserId")]
    public partial class User
    {
    }
    

    。。。

    所以我想添加一个原始方法来获取发送消息的特殊用户。自从 Linq aggregate operators, such as count, are not supported ,我认为一个不错的解决方法是为计数创建一个只读资源端点

       [WebGet]
        public int NumSpecialUsers()
        {
            var context = new SomeDataContext();
            int numUsers =
                context.Messages
                .Where(x => x.special == true && x.UserId != null)
                .Select(x => x.UserId)
                .Distinct()
                .Count();
    
            return numUsers;
        }
    

    并将必要的配置添加到 InitializeService()

        config.SetServiceOperationAccessRule("NumUsers", ServiceOperationRights.AllRead);
    

    我可以通过localhost:1234/MyDataService.svc/NumSpecialUsers成功地调用该方法,但在localhost:1234/MyDataService.svc中没有发现该方法。 这似乎不对。如果不显示在localhost:1234/MyDataService.svc中,这将违反REST,因为这意味着一个不可覆盖的端点。这也意味着,当您使用Visual Studio创建OData Linq代理时,它也不会在那里显示该方法。

    我既不是REST|OData|WCF数据服务专家,所以如果有人对此有想法,我很乐意听取他们的意见。我刚刚开始我对OData和WCF数据服务的冒险,我想采取一种好的方法。非常感谢。

    1 回复  |  直到 12 年前
        1
  •  0
  •   Pratik    12 年前

    问题是,对于要在服务文档中显示的服务操作,如果服务操作采用参数,url会是什么样子?

    我们可以选择不显示任何服务操作,或者只显示不带参数的服务操作——我们在一致性方面犯了错误,做出了前一个选择。

    如果你仍然认为只显示不带参数的服务操作会更好,那么我很想听听这个论点,如果我们得到了很多关于这个功能的反馈,我甚至会做出改变。

    谢谢 普拉提克