【问题标题】:How to filter output columns with WCF OData Services?如何使用 WCF OData 服务过滤输出列?
【发布时间】:2015-07-03 01:13:07
【问题描述】:

对于给定的实体集,例如 WHO_TYPES,我想将列限制为 IDWHO_TYPE_NAME

实体集本身被暴露,通过:

config.SetEntitySetAccessRule("WHO_TYPES", EntitySetRights.AllRead);

...所以我在设置实体/表访问规则时看不到如何执行此操作。是否可以编写一个 QueryInterceptor 来完成此任务?如果有,怎么做?

我的另一个尝试是编写一个引用自定义对象的自定义方法:

[DataServiceKey("MY_WHO_TYPES")]
public partial class MY_WHO_TYPES
{
    public MY_WHO_TYPES() { }

    public int MY_WID { get; set; }
    public string MY_WNAME { get; set; }
}

我的自定义方法:

    [WebGet]
    public IQueryable<MY_WHO_TYPES> GetWhoTypesCustom()
    {
        var whoCustom = from w in this.CurrentDataSource.WHO_TYPES
                        select new MY_WHO_TYPES() { MY_WID = w.ID, MY_WNAME = w.WHO_TYPE_NAME };

        return whoCustom.AsQueryable<MY_WHO_TYPES>();
    }

通过此尝试,我收到以下错误消息:

Unable to load metadata for return type 'System.Linq.IQueryable`1[DAL.Models.MY_WHO_TYPES]' of method 'System.Linq.IQueryable`1[DAL.Models.MY_WHO_TYPES] GetWhoTypesCustom()'.

我感觉在响应中出现了某种存储库模式,但我希望这会更简单。

使用元组的suggestion 听起来不错,但我不太确定如何实现它或返回类型是什么:

select new { Tuple<int, string> (w.ID, w.WHO_TYPE_NAME)};  // error: Invalid anonymous type member declarator.  Anonymous type members must be declared with a memeber assignment...

接下来我尝试简单地返回一个匿名类型:

    [WebGet]
    public IQueryable GetWhoTypesCustom()
    {
        var whoCustom = from w in this.CurrentDataSource.WHO_TYPES
                        select new { w.ID, w.WHO_TYPE_NAME };
        return whoCustom;
    }

这个问题是我收到一个错误,表明 IQueryable 类型未定义。

【问题讨论】:

    标签: odata wcf-data-services asp.net-4.0 anonymous-types


    【解决方案1】:

    最简单的方法是使用存储过程而不是实际实体本身。

    这涉及从存储过程中创建一个复杂类型。定义您希望在存储过程中返回的列,并在创建实体时创建一个复杂对象。

    从 *.edmx 视图:

    Right-click / Add / Function Import
    Select the sproc
    Give it a Function Import Name
    Click Get Column Information
    Click Create New Complex Type - give it a name (by default looks like [Function Import Name]_Result
    

    应该可以工作,但是在使用服务时似乎存在一些问题,在浏览器中导航到 URL 会显示数据,但是在应用程序中使用它时,会出现错误服务跟踪日志:Configuration evaluation context not found。这在另一个问题中得到解决。

    但是,如果它是 sproc 中到实体之一的 1:1 字段映射,则在上述步骤中,不要选择新的复杂类型,而是选择 Entities 和匹配的实体,然后在这两种情况下都可以正常工作(URL 导航和消费)。

    class Program
    {
        static void Main(string[] args)
        {
            DataServiceContext context = new DataServiceContext(new Uri("http://localhost:50100/DataService1.svc/"));
            IEnumerable<WHO_TYPES> result = context.Execute<WHO_TYPES>(new Uri("http://localhost:50100/DataService1.svc/GetDataWhoTypesSproc"));
            foreach (WHO_TYPES w in result)
            {
                Console.WriteLine(w.ID + "\t" + w.WHO_TYPE_NAME + "\t" + w.CREATED_DATE);
            }
    
            Console.Read();
        }
    }
    

    发现的问题(无法返回复杂类型)似乎是this 问题的根本原因,并且更准确地解决了here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-13
      • 1970-01-01
      • 2013-01-08
      • 1970-01-01
      • 2019-10-03
      • 1970-01-01
      相关资源
      最近更新 更多