Проблема приведения к операции службы данных WCF - PullRequest
0 голосов
/ 21 марта 2011

У меня возникла проблема с возвратом при возврате того, что я считал IQueryable из операции службы, но, очевидно, это DbQuery.

Обновление: я основываю часть своего кода (ServiceOp, возвращая IEnumerable) из поста Скотта Хансельмана здесь :

[WebGet]
        public IQueryable<Post> GetPopularPosts()

Я настроил базовую службу данных WCF. Согласно ошибке обновления , я определил ее как:

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 Ответ

2 голосов
/ 21 марта 2011

Имейте в виду, что служба WCF не может возвращать типы интерфейсов! Они должны быть конкретными типами DataContract-ed. Особенно IQueryable, поскольку объект IQueryable - это «как вызывать данные», а не как данные.

Попробуйте вместо этого вернуть список:

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

EDIT

Очевидно, вы МОЖЕТЕ вернуть IEnumerable, но не IQueryable. Что имеет смысл, учитывая мое объяснение, что такое IQueryable.

...