如何在foreach循环中使用两个变量
本文关键字:变量 两个 foreach 循环 | 更新日期: 2023-09-27 18:27:45
我正在使用dotConnect linq到sqlite。我想做的是在foreach循环中使用两个变量。遵循了此代码,但它不起作用。这是我的代码片段。
bool check_units(int id)
{
MainDataContext medic = new MainDataContext();
bool check = false;
var medic_query = from m in medic.Medicines
orderby m.Id
where m.Id == id
select m;
var invo_query = from inv in medic.Invoices
orderby inv.Id
where inv.Id == id
select inv;
var med_inv = medic_query.Zip(invo_query, (m, i) => new { Medicine = m, Invoice = i });
foreach(var mi in med_inv)
{
if (mi.Medicine.UNIT > mi.Invoice.UNIT)
{
mi.Medicine.UNIT -= mi.Invoice.UNIT;
if (mi.Medicine.UNIT < 10)
{
MessageBox.Show(mi.Medicine.Name + " is short in Invertory!'nUnits Remaining: " + mi.Medicine.UNIT,
"Inventory Empty", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
}
chk = true;
}
else
{
MessageBox.Show("Not Enough Stock!'nUnits Remaining: " + mi.Medicine.UNIT,
"Inventory Short", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
medic.SubmitChanges();
return chk;
}
我面临的问题是我的代码出现错误
不支持查询运算符"Zip"。
没有任何语法错误或警告。我认为Zip运算符不能用于linqtosql类型的查询!
等待支持!感谢:)
问题是底层查询提供程序无法将Zip
方法转换为原始SQL。由于您没有应用任何额外的过滤器,最简单的方法是使用AsEnumerable
:对查询进行水合
var med_inv = medic_query.AsEnumerable()
.Zip(invo_query, (m, i) => new { Medicine = m, Invoice = i });
你确定每个查询的记录排列正确吗?这看起来应该是一个Join
,但由于您没有指定记录是否相关/如何相关,我们无法判断正确的连接是什么。
您看到的问题与IQueryable<T>
提供程序不支持Zip
方法有关。强制将数据移动到内存应该可以解决这个问题-您可以使用AsEnumerable
进行强制转换,或者将数据显式地放入内存,如下所示:
var medList = medic_query.ToList();
var invoList = invo_query.ToList();
var med_inv = medList.Zip(invoList, (m, i) => new { Medicine = m, Invoice = i });
这应该不会对性能产生太大影响,因为Zip
无论如何都会将这两个列表带入内存。
Add-AsEnumerable()调用:
var med_inv = medic_query.AsEnumerable().Zip(invo_query.AsEnumerable(), (m, i) => new { Medicine = m, Invoice = i });