无法将类型'System.Linq.IQueryable <anonymoustype#2>'隐式转换为'System.Linq.IQueryable <whiteboardapp.models.brokeroutright> </whiteboardapp.models.brokeroutright> </anonymoustype#2>

时间:2015-03-10 17:53:18

标签: c# linq

我在使用以下C#代码

在我的应用程序中返回一些数据时遇到问题
[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&#39;到System.Linq.IQueryable

我可以知道明确的转换吗?

3 个答案:

答案 0 :(得分: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提供程序所知道的类型,您可能需要使用AsEnumerable()在LINQ to Objects中执行投影 - 但是您必须返回IEnumerable<BrokerOutright>而不是IQueryable<BrokerOutright>

答案 1 :(得分:1)

您选择的是.Select(x => new { x.Id, x.Product, x.Term的匿名类型,但函数的返回值应为BrokerOutright。听起来您可能希望完全从查询中删除Select子句。

答案 2 :(得分:1)

您将返回动态类型,而不是方法签名所说的内容。

尝试更改:

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

有关

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