2015-03-10 3 views
0

У меня есть проблема возвращающегося некоторые данные в моем приложении, используя следующий код C#Не может неявно преобразовать тип «System.Linq.IQueryable <AnonymousType # 2>» на «System.Linq.IQueryable <WhiteBoardApp.Models.BrokerOutright>

[Queryable(AllowedQueryOptions = System.Web.Http.OData.Query.AllowedQueryOptions.Select)] 
public override IQueryable<BrokerOutright> Get() 
{ 
return db.BrokerOutrights.Where(b => b.BidBroker == User.Identity.Name 
            || b.OfferBroker == User.Identity.Name) 
       .Select(x => new 
       { 
        x.Id, 
        x.Product, 
        x.Term, 
        (x.AskB=='dev')?x.AskB:null, 
        (x.AskB=='dev')?x.AVol:null 
       } 
       ); 
} 

Приведенный выше код бросил меня следующее исключение

не может неявно преобразовать тип 'System.Linq.IQueryable' в «System.Linq.IQueryable

Могу ли я узнать хорошее явное преобразование?

+0

Почему преобразовать в новый тип вообще? Если вы выбираете из 'db.BrokerOutrights', то, вероятно, вы уже выбираете нужный тип? Просто полностью удалите предложение '.Select()'. – David

+0

Я хотел бы использовать некоторые сравнения в предложении select, и именно по этой причине я включил .Select() – DoIt

+0

Не совсем понятно, что вы имеете в виду, у вас есть пример этого? Поскольку код, который вы показали, не представляет необходимости. .Select(). – David

ответ

4

Да потому, что вы осуществляете анонимного типа:

.Select(x => new 
{ 
    x.Id, 
    x.Product, 
    x.Term 
}) 

Это звучит, как вы хотите использовать инициализатор объекта для типа BrokerOutright:

.Select(x => new BrokerOutright 
{ 
    Id = x.Id, 
    Product = x.Product, 
    Term = x.Term 
}) 

Сказав, что, если db.BrokerOutrights уже является IQueryable<BrokerOutright>, вы можете просто захотеть полностью отключить Select:

return db.BrokerOutrights 
     .Where(b => b.BidBroker == User.Identity.Name || 
        b.OfferBroker == User.Identity.Name); 

Если BrokerOutright не является типом, о котором знает поставщик LINQ, возможно, вам потребуется выполнить проецирование в LINQ to Objects вместо AsEnumerable() - но тогда вам нужно будет вернуть IEnumerable<BrokerOutright> вместо IQueryable<BrokerOutright>.

+0

Кроме того, если 'BrokerOutrights' является классом сгенерированного фреймом, вы не можете использовать его в проекции. – Habib

+0

это бросило мне еще одну ошибку. Сущность или сложный тип «WhiteBoardApp.Models.BrokerOutright» не могут быть построены в запросе LINQ to Entities. – DoIt

+0

@Dev: Смотрите мое редактирование. (Это поможет, если вы предоставите больше контекста ...) –

1

Выбираете анонимный тип с .Select(x => new { x.Id, x.Product, x.Term, но ожидается, что возвращаемое значение вашей функции будет BrokerOutright. Похоже, что вы, вероятно, хотите полностью отказаться от предложения Select.

1

Вы возвращаете динамический тип вместо того, что говорит ваша подпись метода.

Попробуйте изменить:

.Select(x => new 
       { 
        x.Id, 
        x.Product, 
        x.Term 
       } 

Для

.Select(x => new BrokerOutright 
       { 
        Id = x.Id, 
        Product = x.Product, 
        Term = x.Term 
       }); 
Смежные вопросы