【问题标题】:How to cast an anonymous type to IQueryable<Order_Detail>?如何将匿名类型转换为 IQueryable<Order_Detail>?
【发布时间】:2013-05-24 11:50:46
【问题描述】:

我正在创建一个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”。

我怎样才能做到这一点?

【问题讨论】:

    标签: c# wcf odata


    【解决方案1】:

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

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

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

    【讨论】:

    • 你好 Habib,我已经根据你的建议修改了我的代码,但我仍然遇到同样的错误。
    • @RudreshBhatt,您正在尝试什么方法?你创建新课程了吗?
    • 我按照您的建议创建了一个新课程,但没有成功。只有错误改变了“不能简单地将 IQueryable 转换为 Linq”
    • 您是否将查询从 select new 更改为 select MyClass
    猜你喜欢
    • 2011-04-19
    • 1970-01-01
    • 1970-01-01
    • 2012-05-01
    • 2020-04-18
    • 2012-01-20
    • 1970-01-01
    • 2012-08-12
    相关资源
    最近更新 更多