0

我使用 WCF OData 服务作为我的应用程序数据提供程序。OData 服务公开了一个我不想获取整个实体的实体,我创建 LINQ 查询以从该实体获取投影。但我在 OData 服务中有错误。这是我的代码:

from n in NewsInfos
select new NewsInfos
{
    n.NewsId,
    n.NewsTitle,
    n.NewsLead,
    n.NewsDate
};

这是完整的代码:

[System.ServiceModel.ServiceBehavior(IncludeExceptionDetailInFaults = true)]
    public class NewsDataService : DataService<NewsODataModel>
    {
        public static void InitializeService(DataServiceConfiguration config)
        {
            config.SetEntitySetAccessRule("*", EntitySetRights.AllRead);
            config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V2;
            config.DataServiceBehavior.AcceptProjectionRequests = true;
        }
    }
4

2 回答 2

1

是的,WCF 数据服务和 OData 支持投影。投影在带有$select系统查询选项的 URL 中编码,例如:http://services.odata.org/Experimental/OData/OData.svc/Products?$select=Name&$format=json。客户端位中的 LINQ 提供程序启用此功能,类似于您在示例中显示的内容。这是一个这样的例子:

using System;
using System.Data.Services.Client;
using System.Linq;

namespace Scratch
{
    public class Program
    {
        public static void Main()
        {
            var context = new DataServiceContext(new Uri("http://services.odata.org/OData/OData.svc/"));
            var categories = context.CreateQuery<Category>("Categories").Select(c => new { c.Name });
            Console.WriteLine("context.Categories.Where(...): {0}", categories);
            foreach (var category in categories)
            {
                Console.WriteLine(category.Name);
            }
        }
    }

    public class Category
    {
        public int ID { get; set; }
        public string Name { get; set; }
    }
}

投影需要考虑的一件事是,我们客户端位的魔力经常需要您使用匿名对象(因此使用new { c.Name }.

您的错误可能无关紧要;如果您在阅读本文后仍然收到错误,您可以根据http://blogs.msdn.com/b/phaniraj/archive/2008/06/18/debugging-ado-net更新您的服务以返回详细错误数据服务.aspx ? [DataServiceKey]我的猜测是您可能缺少NewsInfos.

于 2012-07-17T15:32:22.753 回答
0

只需从您的选择中返回一个匿名对象,它应该可以工作。

from n in NewsInfos
select new
{
    n.NewsId,
    n.NewsTitle,
    n.NewsLead,
    n.NewsDate
};
于 2013-08-12T19:03:10.430 回答