【问题标题】:IQueryable to IEnumerableIQueryable 到 IEnumerable
【发布时间】:2014-10-25 17:43:48
【问题描述】:
public IEnumerable<Temp_Order> Get_Temp(string id)
{
    //List<Temp_Order> data = new List<Temp_Order>();
    IEnumerable<Temp_Order> data = db.Temp_Order
                                      .Join(db.Items, 
                                            t_id => t_id.ItemId, 
                                            I_id => I_id.ItemId,
                                            (t_id, I_id) => new  { t_id.Quantity, I_id.ItemName })
                                      .Where(x => x.ItemName == id);

    return data;
}

在这个方法中我想要IEnumerable&lt;Temp_Order&gt;。所以我将在控制器中使用它并返回视图。

我收到此错误:

无法将类型“System.Linq.IQueryable”隐式转换为“System.Collections.Generic.IEnumerable”。存在显式转换(您是否缺少演员表?) E:\WORK\Projects\RMS_Live\RMS_Live\Models\Order.cs

【问题讨论】:

  • @TheodorosChatzigiannakis 我认为我的错误是由于加入查询。您提供的链接,在该链接中查询中没有 JOIN

标签: asp.net-mvc entity-framework


【解决方案1】:

Join 正在将您的查询转换为匿名类型的 IEnumerable。在末尾添加Select 以投射回Temp_Order

public IEnumerable<Temp_Order> Get_Temp(string id)
{
    //List<Temp_Order> data = new List<Temp_Order>();
    IEnumerable<Temp_Order> data = db.Temp_Order
                    .Join(db.Items, t_id => t_id.ItemId, I_id => I_id.ItemId, (t_id, I_id) => new  { t_id.Quantity, I_id.ItemName })
                    .Where(x => x.ItemName == id)
                    .Select(a => new Temp_Order
                        {
                            ItemName = a.ItemName,
                            Property2 = a.Property2,
                            //snip
                        });

    return data;
}

编辑:

您在 cmets 中指出您想要来自 Temp_OrderItem 的所有属性,这意味着您需要另一个类。您无需创建另一个类就可以逃脱,但从长远来看,它要简单得多。所以首先让你的类,想到两种方法,你要么复制你需要的所有属性,要么只返回 2 个对象,我将使用后者:

public class OrderItem
{
    public Temp_Order Temp_Order { get; set; }
    public Item Item { get; set; }
}

现在你的函数变成了:

public IEnumerable<OrderItem> Get_Temp(string id)
{
    IEnumerable<OrderItem> data = db.Temp_Order
                    .Join(db.Items, 
                          t_id => t_id.ItemId, 
                          I_id => I_id.ItemId,
                          (t_id, I_id) => new OrderItem
                              {
                                  Temp_Order = t_id,
                                  Item = I_id
                              })
                    .Where(x => x.ItemName == id);

    return data;
}

在您看来,请确保将模型类型设置为 IEnumerable&lt;OrderItem&gt;,并且您可以像这样访问所有属性:

@Model.Temp_Order.ItemName

【讨论】:

  • Thnx :D ...但我将如何访问 Select 中的 Item 表字段?
  • a 包含您在 Join 子句中选择的所有内容的字段,因此您只有 QuantityItemName 可用。
  • .Select(a => new Temp_Order { Quantity = a.Temp_Order.Quantity, ItemName=a.Item.ItemName} ...它给出错误...。只能访问 Temp_Order 字段在这个 SELECT :(
  • 请记住,您将所有这些数据存储在 Temp_Order 对象中,您不能向其中添加自己的属性。
  • 那么我的返回类型应该是什么而不是 Ienumerable?我想要 Temp_order 和 Item Table 的所有字段并在视图中显示它们......请帮助我
猜你喜欢
  • 2014-11-09
  • 1970-01-01
  • 2020-04-28
  • 2011-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多