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 Data Services と OData はプロジェクションをサポートしています。$selectプロジェクションは、システム クエリ オプションを使用して URL で成文化されます (例: http://services.odata.org/Experimental/OData/OData.svc/Products?$select=Name&$format=json ) 。クライアント ビットの LINQ プロバイダーは、例で示したものと同様にこれを有効にします。そのような例の 1 つを次に示します。

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; }
    }
}

プロジェクションで考慮すべきことの 1 つは、クライアント側ビットの魔法により、匿名オブジェクトを使用することが頻繁に必要になることです (したがってnew { c.Name })。

あなたのエラーは無関係かもしれません。これを読んでもまだエラーが発生する場合は、 http://blogs.msdn.com/b/phaniraj/archive/2008/06/18/debugging-ado-net-に従って詳細なエラーを返すようにサービスを更新できますか? data-services.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 に答える