如何在C#?</order_detail>中将匿名类型转换为IQueryable <order_detail>

时间:2013-05-24 11:50:47

标签: c# wcf odata

我正在创建一个OData service方法,我在其中编写了以下代码

[WebGet]
        public IQueryable<Order_Detail> getByYear(int year)
        {
            var dc = new NorthwindBigEntities();
            var query = from p in dc.Order_Details
                        where p.Order.OrderDate != null && p.Order.OrderDate.Value.Year == year
                        select new
                        {
                            TotalSales = p.UnitPrice * p.Quantity,
                            Product = p.Product.ProductName
                        };
            return query;
        }

但我得到了一个例外

无法将类型'System.Linq.IQueryable AnonymousType#1'隐式转换为'System.Linq.IQueryable CustomMethod.Order_Detail'。

我怎么能做到这一点??

1 个答案:

答案 0 :(得分:5)

而不是select newselect p。目前您正在选择匿名对象,但无法将其转换为System.Linq.IQueryable CustomMethod.Order_Detail

您无法投射到Order_Detail,因为它似乎是一类框架。由于您在匿名对象中进行计算,因此您可以通过IQueryable<Order_Detail>返回select p并稍后在LINQ上进行计算以进行对象,或者您可以创建一个新类和项目。如果您最终创建了一个新类,那么您应该根据类名修改您的签名。

public IQueryable<Order_Detail> getByYear(int year)
{
    var dc = new NorthwindBigEntities();
    var query = from p in dc.Order_Details
                where p.Order.OrderDate != null && p.Order.OrderDate.Value.Year == year
                select p;
    return query;
}

如果您创建一个新类,如:

public class MyClass 
{
    public string Product {get;set;}
    public double TotalSales {get;set;}
}

然后你可以做

public IQueryable<MyClass> getByYear(int year)
{
    var dc = new NorthwindBigEntities();
    var query = from p in dc.Order_Details
                where p.Order.OrderDate != null && p.Order.OrderDate.Value.Year == year
                select new MyClass
                {
                    TotalSales = p.UnitPrice * p.Quantity,
                    Product = p.Product.ProductName
                };
    return query;
}

考虑它的服务返回数据,如果您创建自己的类并且仅返回所需的属性,则会更好。您还应该看到this question