从 Foreach 内的列表中提取字段值时遇到问题

Trouble pulling Field Value from List inside Foreach

目标:我有一个索引视图,显示来自 Table (ICS_Transactions) 的所有打开记录。目前它显示所有记录。我正在尝试做一些快速的事情来过滤掉在辅助 table (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);

使用 Select() 怎么样?

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

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

  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();

如果我正确理解了您的目标,您可以将 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);
  • 注意:我确实更改了变量名称,以便我自己更容易理解。我喜欢描述性名称,即使它们很长。