WCF数据服务操作转换问题

时间:2011-03-21 06:52:20

标签: c# wcf linq entity-framework wcf-data-services

我在从服务操作中返回我认为是IQueryable时遇到了一个转换问题,但显然是DbQuery。

更新:我的一些代码(ServiceOp,返回IEnumerable)基于Scott Hanselman的post here

[WebGet]
        public IQueryable<Post> GetPopularPosts()

我已经设置了一个基本的WCF DataService。根据{{​​3}},我将其定义为:

public class Api : DataService<ObjectContext>

而不是来自TestDb。我将CreateDataSource()设置为:

protected override ObjectContext CreateDataSource()
{
    var testDb = new TestDb();
    var objectContext = ((IObjectContextAdapter)testDb).ObjectContext;
    objectContext.ContextOptions.ProxyCreationEnabled = false;
    return objectContext;
}

在我的InitializeService方法中,我调用:

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

我的服务操作是:

[WebGet]
public IQueryable<Stuff> GetStuff()
{
    var context = new TestDb();
    return context.Stuff;
}

问题是即使方法完成,并且context.Stuff中有项,服务器也会返回错误:

An error occurred while processing this request. Exception has been thrown by the target of an invocation. System.Reflection.TargetInvocationException 
...
Unable to cast object of type 'System.Data.Entity.Infrastructure.DbQuery' to type 'System.Linq.IQueryable`

对此有何想法?

1 个答案:

答案 0 :(得分:2)

请记住,WCF服务无法返回接口类型!它们需要是具体的DataContract-ed类型。特别是IQueryable,因为IQueryable对象实际上是“如何调用数据”而不是实际数据。

尝试返回列表:

[WebGet]
public List<Stuff> GetStuff()
{
    var context = new TestDb();
    return context.Stuff.ToList();
}

修改

显然你可以返回IEnumerable,但不能返回IQueryable。鉴于我对IQueryable的解释,这是有道理的。