我正在使用WCF OData服务作为我的应用程序Data Provider.OData服务公开一个我不想获得整个实体的实体,我创建LINQ查询以从该实体获取投影。 但我在OData Service中有错误。这是我的代码:
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;
}
}
答案 0 :(得分:1)
是的,WCF数据服务和OData支持预测。使用$select
系统查询选项在网址中对投影进行编码,例如: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-data-services.aspx更新服务以返回详细错误?我的猜测是,您可能会错过[DataServiceKey]
上的NewsInfos
属性。
答案 1 :(得分:0)
只需从您的选择中返回一个匿名对象即可。
from n in NewsInfos
select new
{
n.NewsId,
n.NewsTitle,
n.NewsLead,
n.NewsDate
};