从 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 字段的集合。
- 将
MyReqs
更改为var MyReqs = trans.RequsitionNumber;
并移入foreach
- 变化:
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);
- 注意:我确实更改了变量名称,以便我自己更容易理解。我喜欢描述性名称,即使它们很长。
目标:我有一个索引视图,显示来自 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 字段的集合。
- 将
MyReqs
更改为var MyReqs = trans.RequsitionNumber;
并移入foreach
- 变化:
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);
- 注意:我确实更改了变量名称,以便我自己更容易理解。我喜欢描述性名称,即使它们很长。