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

Rud*_*att 2 c# wcf odata

我正在创建一个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;
}
Run Code Online (Sandbox Code Playgroud)

但我得到一个例外

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

我怎么能完成这个?

Hab*_*bib 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;
}
Run Code Online (Sandbox Code Playgroud)

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

public class MyClass 
{
    public string Product {get;set;}
    public double TotalSales {get;set;}
}
Run Code Online (Sandbox Code Playgroud)

那你可以做

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;
}
Run Code Online (Sandbox Code Playgroud)

考虑到它的服务返回数据,如果您创建自己的类并仅返回所需的属性,则会更好.你也应该看到这个问题