【问题标题】:Trouble pulling Field Value from List inside Foreach无法从 Foreach 内的列表中提取字段值
【发布时间】:2020-06-25 02:15:09
【问题描述】:

目标:我有一个显示表 (ICS_Transactions) 中所有打开记录的索引视图。目前它显示所有记录。我正在尝试快速过滤掉辅助表(ICS_Orders)中不匹配的任何记录。无需显示任何没有关联订单的记录。

我几乎可以正常工作(我认为)。我相信我的问题是这个区域

var MyReqs = q.FirstOrDefault().RequsitionNumber;

foreach 有效,只是它每次只抓取第一个记录的申请号。我明白为什么(FirstorDefault)。但是,我不知道用什么来代替它——以便每次都循环播放。我尝试简单地删除 (.FirstOrDefault()) 但该语法不正确。

这是完整的索引控制器代码

List<ICS_Transactions> newqList = new List<ICS_Transactions>();
var q = db.ICS_Transactions.Where(s => s.OpenClosed == "Open");
q = q.Where(s => s.TransType == "New Internal Order");

var MyReqs = q.FirstOrDefault().RequsitionNumber;

foreach (ICS_Transactions trans in q)
{
//do whtaever you need to see if this trans should be includxed

var z = db.ICS_Orders.Where(s => s.RequisitionNumber == MyReqs );

if (z == null)
{
// do nothing
          
else 
{ 
newqList.Add(trans); 
}
           
}

return View(newqList);

【问题讨论】:

    标签: c# asp.net-mvc-5


    【解决方案1】:
    1. MyReqs 更改为var MyReqs = trans.RequsitionNumber; 并将其移入foreach
    2. 更改:
    if (z == null)
    {
        // do nothing
    }       
    else 
    { 
        newqList.Add(trans); 
    }
    

    到:

    if(z.Any())
    { 
        newqList.Add(trans); 
    }
    

    或者,如果您设置了关系,您可以尝试在一个查询中进行,看起来像这样(不确定您拥有的关系):

    var newqList = db.ICS_Transactions
        .Where(s => s.OpenClosed == "Open");
        .Where(s => s.TransType == "New Internal Order")
        .Where(s => s.ICS_Orders.Any())
        .ToList();
    

    或者至少在一个查询中从ICS_Orders 获取所有需要的RequsitionNumber 到数据库和过滤列表:

    var newqList = db.ICS_Transactions.Where(s => s.OpenClosed == "Open");
        .Where(s => s.TransType == "New Internal Order")
        .ToList();
    
    var reqsInOrders = db.ICS_Orders
        .Where(s => newqList.Select(n => n.RequisitionNumber).Contains(s.RequisitionNumber))
        .Select(s => s.RequisitionNumber)
        .ToList();
    
    newqList  = newqList
        .Where(t => reqsInOrders.Contains(t.RequisitionNumber))
        .ToList();
    

    【讨论】:

    • Guru Stron - 谢谢!感谢所有回答的人。我相信一切都很棒。我选择了您的第一个解决方案示例,因为它最有意义,而且我已经走了。我感谢所有帮助我理解的附加信息。其他回复也很棒。
    • @ExecChef 很乐意提供帮助!你也可以投票给其他答案;)
    【解决方案2】:

    使用 Select() 怎么样?

    var z = q.Select(p => p.RequisitionNumber);
    

    现在您有了一个集合,其中仅包含“q”集合中每个对象的 RequisitionNumber 字段。

    【讨论】:

      【解决方案3】:

      如果我正确理解您的目标,您可以将 Where 与 Any 查询结合起来,使用 Linq 一次性获得您要查找的内容。

      var openInternalTransactions =
          db.ICS_Transactions
              .Where(s => s.OpenClosed == "Open")
              .Where(s => s.TransType == "New Internal Order");
      
      var openInternalTransactionsWithOrders =
          openInternalTransactions.Where(trans => 
              db.ICS_Orders.Any(order =>
                  order.RequisitionNumber == trans.RequisitionNumber));
      
      return View(openInternalTransactionsWithOrders);
      
      • 注意:我确实更改了变量名称,以便自己更容易理解。我喜欢描述性名称,即使它们很长。

      【讨论】:

        猜你喜欢
        • 2015-02-27
        • 2012-06-01
        • 1970-01-01
        • 1970-01-01
        • 2017-06-10
        • 2019-02-27
        • 1970-01-01
        • 2021-04-06
        • 2020-10-06
        相关资源
        最近更新 更多