如何将匿名类型强制转换为IQueryable

本文关键字:IQueryable Order Detail 转换 类型 | 更新日期: 2023-09-27 18:15:15

我正在创建一个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'.

我怎样才能做到这一点?

如何将匿名类型强制转换为IQueryable<Order_Detail>

代替select newselect p。当前您选择的是匿名对象,无法将其转换为System.Linq.IQueryable CustomMethod.Order_Detail

你不能投射到Order_Detail,因为它似乎是一个框架类。由于您正在匿名对象中进行计算,您可以通过select p返回IQueryable<Order_Detail>并稍后在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;
}

考虑到是一个返回数据的服务,最好创建自己的类并只返回所需的属性。您还应该看到这个问题