1

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

[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”。

我怎样才能做到这一点?

4

1 回答 1

5

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

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

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;
}

考虑到它是一项返回数据的服务,如果您创建自己的类并仅返回所需的属性,那就更好了。你也应该看到这个问题

于 2013-05-24T11:59:38.723 回答