【问题标题】:How to fix 'Cannot implicitly convert type System.Collections.Generic.List<> to System.Collections.Generic.List<>'如何修复“无法将类型 System.Collections.Generic.List<> 隐式转换为 System.Collections.Generic.List<>”
【发布时间】:2019-06-15 15:16:50
【问题描述】:

谁能告诉我为什么我无法在 GetWorkOrdersByLocation 中返回 workOrders?这是我的控制器:

public IActionResult Index()
{
    return View();
}

public IActionResult Privacy()
{
    return View();
}

public IActionResult WorkOrders()
{
    GetWorkOrders();
    return View(); 
}

public IActionResult GetWorkOrders()
{
    List<WorkOrder> workOrders = new List<WorkOrder> ();

    workOrders.Add(new WorkOrder { UserId = 1, LocationId = 
"Philadelphia", Date = DateTime.Now, Reason = "Lights", IsActive = 
true });

    workOrders.Add(new WorkOrder { UserId = 2, LocationId = "Camden", 
Date = DateTime.MinValue, Reason = "Plumbing", IsActive = true });

    workOrders.Add(new WorkOrder { UserId = 3, LocationId = 
"Burlington", Date = DateTime.Now, Reason = "Water", IsActive = 
false });

    workOrders.Add(new WorkOrder { UserId = 4, LocationId = 
"Wilmington", Date = DateTime.MaxValue, Reason = "Lights", IsActive 
= true }); return View(workOrders); 

}

public IActionResult GetWorkOrdersByLocation()
{
    List<WorkOrder> workOrders = new List<WorkOrder>();

    workOrders = workOrders.Select(x => x.LocationId).ToList();

    return workOrders; 

}

我在 return 语句 return workOrders 上遇到错误。我不确定为什么这不起作用。我从我的模型类 WorkOrder 创建列表 WorkOrder 的新实例。现在我正在尝试列出所有位置。

【问题讨论】:

  • 你说workOrders = new List&lt;WorkOrder&gt;();,然后尝试给它分配一个List&lt;int&gt;
  • 欢迎来到 Stack Overflow。请问你能格式化你的代码吗?没有任何缩进很难阅读。此外,您还没有在错误消息中指定类型参数,这使得这更难理解。此外,您不能返回 workOrders,因为 List&lt;WorkOrder&gt; 不是 IActionResult。当你修复了 Camilo 所说的错误后,你可能想要return View(workOrders);
  • 除了 Camilo Terevinto 所说的之外,在 GetWorkOrdersByLocation 中,您创建一个空的工作订单列表,然后对其进行选择,这也会产生一个空列表。如果您有一个已填写的工单列表,结果将与方法的名称不匹配。
  • @CamiloTerevinto 我做了:public IActionResult GetWorkOrdersByLocation() { List workOrders = new List(); var wOrders = workOrders.Select(x => x.LocationId).ToList();返回视图(wOrders); }
  • GetWorkOrdersByLocation() 需要使用来自GetWorkOrders()workOrders

标签: c# linq model-view-controller .net-core


【解决方案1】:

您的代码有几个问题:

  1. GetWorkOrdersByLocation 中,您定义了List&lt;WorkOrder&gt; workOrders 并尝试为其分配List&lt;string&gt;,因为LocationId 是字符串类型。
  2. GetWorkOrdersByLocation 中,您只有一个空的workOrders 列表,因此任何对其进行的选择也将返回空。
  3. WorkOrders 似乎与 GetWorkOrdersByLocation 类似,但创建一个视图时不提供任何数据,因为尽管您调用 GetWorkOrdersByLocation,但您不会对其返回的内容做任何事情。
  4. 次要 (?) 一个,GetWorkOrdersByLocation 的命名与您返回工作订单位置时似乎想要的不完全匹配,而不是按位置(排序/分组?)的工作订单。

一般来说,您需要一种方法来提供您的数据。 GetWorkOrders 似乎是这样做的,但是您返回的是视图,而不是数据。此方法只应返回您的列表,然后由WorkOrdersGetWorkOrdersByLocation 使用。

public IActionResult WorkOrders()
{
    // get the work order list and return a view on it
    return View(GetWorkOrders()); 
}

private List<WorkOrder> GetWorkOrders()
{
    List<WorkOrder> workOrders = new List<WorkOrder> ();

    workOrders.Add(new WorkOrder { UserId = 1, LocationId = 
"Philadelphia", Date = DateTime.Now, Reason = "Lights", IsActive = 
true });

    workOrders.Add(new WorkOrder { UserId = 2, LocationId = "Camden", 
Date = DateTime.MinValue, Reason = "Plumbing", IsActive = true });

    workOrders.Add(new WorkOrder { UserId = 3, LocationId = 
"Burlington", Date = DateTime.Now, Reason = "Water", IsActive = 
false });

    workOrders.Add(new WorkOrder { UserId = 4, LocationId = 
"Wilmington", Date = DateTime.MaxValue, Reason = "Lights", IsActive 
= true });

 // return the work orders to be used by your view methods
 return workOrders; 
}

public IActionResult GetWorkOrdersByLocation()
{
    // get your work order list and extract all locations
    var locations = GetWorkOrders().Select(x => x.LocationId).ToList();

    // return view on all locations
    return View(locations); 
}

如果您希望最后一个方法返回按位置排序的所有工单的视图,请执行以下操作:

public IActionResult GetWorkOrdersByLocation()
{
    // get your work order list and sort by location
    var sortedByLocation = GetWorkOrders().OrderBy(x => x.LocationId).ToList();

    // return view on all sorted work orders
    return View(sortedByLocation); 
}

【讨论】:

  • 有没有办法让 GetWorkOrdersByLocation 成为一个类而不是 IActionResult? @ckuri
  • @MeganMeluskey 取决于你想用它做什么。如果您只想在视图上显示此数据,则为 IActionResult。如果您只想将其用于其他方法,您可以将其更改为List&lt;string&gt; 并执行return sortedByLocation。如果你想要两者,你需要有两个方法,比如 WorkOrders/GetWorkOrders。
  • 为什么我不必创建 List workOrders = new List();在 GetWorkOrdersByLocation() ActionResult 中?那是因为 GetWorkOrders 已经包含它并且我们在 .Select 之前传递 GetWorkOrders 吗?您是否有任何资源可以解释 .Select(x => x.LocationId).ToList() 和其他查询的含义?我认为这意味着第一个 x 是 WorkOrders 的对象,它正在通过对象进行交互并拉出所有位置。感谢您的所有帮助
  • 我希望能够在其他方法中使用它,所以我必须将其更改为 public List GetWorkOrdersByLocation() { }? @ckuri
  • 是的,GetWorkOrders 返回一个列表,因此当 GetWorkOrdersByLocation 调用 GetWorkOrders 时,它会收到该列表并可以使用它。因此无需创建另一个列表。对于 Select,请参阅docs.microsoft.com/en-us/dotnet/api/…,它基本上是从 WorkOrder 进行投影,这是它的属性的 x 参数,用于列表中的每个元素。对于其他 LINQ 查询方法,另请参阅链接文档中左侧面板上列出的几种方法。对于您的第二个问题:是的,只需返回列表即可。
【解决方案2】:

GetWorkOrdersByLocation() 实际上并没有从任何地方得到任何workOrders,它只是有一个空的List&lt;WorkOrder&gt;(); - 也许调用一些东西(私人?)从某个地方得到一些然后return View (workOrders); 我删掉了你的一些代码从我的示例中只关注请求。

private List<WorkOrder> CreateWorkOrders()
{
    List<WorkOrder> workOrders = new List<WorkOrder> ();

    workOrders.Add(new WorkOrder { UserId = 1, LocationId = 
"Philadelphia", Date = DateTime.Now, Reason = "Lights", IsActive = 
true });
    workOrders.Add(new WorkOrder { UserId = 2, LocationId = "Camden", 
Date = DateTime.MinValue, Reason = "Plumbing", IsActive = true });
    workOrders.Add(new WorkOrder { UserId = 3, LocationId = 
"Burlington", Date = DateTime.Now, Reason = "Water", IsActive = 
false });
    workOrders.Add(new WorkOrder { UserId = 4, LocationId = 
"Wilmington", Date = DateTime.MaxValue, Reason = "Lights", IsActive 
= true }); 
    return workOrders; 
}

public IActionResult GetWorkOrdersByLocation(string locationid)
{
    var workOrders CreateWorkOrders();
    locationWorkOrders = workOrders.Where(x => x.LocationId == locationid).ToList();
    return View(locationWorkOrders); 
}

评论中的问题:“被列表”是的List&lt;string&gt; 在这种情况下是一种方式。您还可以为您的位置创建一个类,因为这些类通常是具有 ID、短名称(如州缩写)、长名称、描述等具有适当命名属性的单独事物。

【讨论】:

  • 谢谢你知道如何在没有 IActionResult 或 ReturnView 的情况下制作 GetWorkOrdersByLocation 吗? @马克
  • 只需返回locationWorkOrders创建的List&lt;WorkOrder&gt;,并将其设置为返回类型public List&lt;WorkOrder&gt; GetWorkOrdersByLocation(string locationid)。请注意,CreateWorkOrders 中的内容通常会读取数据库或列表的其他存储库,并且会在另一个类中。
  • 公开列表 GetWorkOrdersByLocation() { var locations = GetWorkOrders().Select(x => x.LocationId).ToList();返回地点; }
  • 所以,如果您使用您拥有的代码,请返回 List&lt;string&gt; 或“位置”具有的任何类型,并为“位置”制定模型并返回这些列表。好吧,你正在返回一个字符串列表,了解我的回答中 Select 和 Where 之间的区别。似乎您会从对课程和 Linq 的一些研究中受益。注意 var workOrders 实际上与返回一个位置的工作订单列表的 List workOrders 相同。
  • 所以我认为您所说的问题是当我执行 List 时,它应该是 list 因为我只返回模型中的一个字段,而不是整个对象???
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-08
相关资源
最近更新 更多