C# 如何在foreach循环中使用两个变量?
我正在使用dotConnect linq连接到sqlite。我想做的是在foreach循环中使用两个变量。遵循了代码,但不起作用。这是我的代码片段C# 如何在foreach循环中使用两个变量?,c#,linq,foreach,C#,Linq,Foreach,我正在使用dotConnect linq连接到sqlite。我想做的是在foreach循环中使用两个变量。遵循了代码,但不起作用。这是我的代码片段 bool check_units(int id) { MainDataContext medic = new MainDataContext(); bool check = false; var medic_query = from m in medic.Medicines
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;
}
bool检查单元(int-id)
{
MainDataContext medic=新的MainDataContext();
布尔检查=假;
var medic_query=来自medic.Medicines中的m
医嘱人m.Id
其中m.Id==Id
选择m;
var invo_query=来自医疗发票中的库存
订购者库存Id
其中inv.Id==Id
选择inv;
var med_inv=medic_query.Zip(发票查询,(m,i)=>new{Medicine=m,Invoice=i});
foreach(med_inv中的var mi)
{
如果(mi.Medicine.UNIT>mi.Invoice.UNIT)
{
mi.Medicine.UNIT-=mi.Invoice.UNIT;
如果(mi.Medicine.UNIT<10)
{
MessageBox.Show(mi.Medicine.Name+)在倒装词中缩写!\n其剩余部分:“+mi.Medicine.UNIT,
“库存为空”,MessageBoxButtons.OK,MessageBoxIcon.感叹号);
}
chk=真;
}
其他的
{
MessageBox.Show(“库存不足!\n剩余量:”+mi.Medicine.UNIT,
“库存短缺”,MessageBoxButtons.OK,MessageBoxIcon.Error);
}
}
医师提交变更();
返回chk;
}
我面临的问题是我的代码给出了一个错误
不支持查询运算符“Zip”
没有语法错误或警告。
我认为Zip运算符不能用于linqtosql类型的查询
等待支持!
谢谢:)问题是基础查询提供程序无法将
Zip
方法转换为原始SQL。由于您没有应用任何附加过滤器,最简单的方法是使用AsEnumerable
:
var med_inv = medic_query.AsEnumerable()
.Zip(invo_query, (m, i) => new { Medicine = m, Invoice = i });
您确定每个查询中的记录正确排列吗?这看起来应该是一个
连接
,但由于您没有指定记录是否相关/如何相关,我们无法判断正确的连接是什么。问题是基础查询提供程序无法将Zip
方法转换为原始SQL。由于您没有应用任何附加过滤器,最简单的方法是使用AsEnumerable
:
var med_inv = medic_query.AsEnumerable()
.Zip(invo_query, (m, i) => new { Medicine = m, Invoice = i });
您确定每个查询中的记录正确排列吗?这看起来应该是一个
连接
,但由于您没有指定记录是否相关/如何相关,我们无法确定正确的连接是什么。您看到的问题与IQueryable
提供程序不支持的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
无论如何都会将这两个列表带入内存。您看到的问题与Zip
方法不受IQueryable
提供程序支持有关。强制将数据移动到内存应该可以解决此问题-您可以使用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
无论如何都会将这两个列表带到内存中。添加一个可数()调用:
添加AsEnumerable()调用:
这里的关键是,您将两个查询分别向下拉,这样您就可以进行2 DB的往返,而不是将它们合并到一个查询中(理论上,可以想象一个
Zip
实现将这两个查询都放在一个批处理中)。我不确定是否有其他方法可以使用该查询提供程序对查询查询进行批处理。@我同意-如果查询提供程序无法执行此操作,您需要在内存中运行Zip
。谢谢您的建议,但现在控件没有进入foreach循环!与另一个建议相同:(@MuneebMirza CheckmedList.Count
然后:它是零。@dasblinkenlight:谢谢先生!你帮了我很多。现在我犯了什么错误!这里的关键是你把两个查询分别拉下来,这样你就可以进行2 DB的往返,而不是将它们合并到一个查询中(从理论上讲,可以想象一个Zip
实现将两者都放在一个批中)。我不确定是否有其他方法可以使用该查询提供程序对查询查询进行批处理。@我同意-如果查询提供程序无法执行此操作,则需要在内存中运行Zip
。感谢您按照建议执行操作,但现在控件没有进入foreach循环!与其他建议相同:(@MuneebMirza CheckmedList.Count
然后:它是零。@dasblinkenlight:谢谢先生!你帮了我很多。现在我犯了什么错误!谢谢你按照你的建议做了,但是现在控件没有进入foreach循环!实际上两个表都是一样的!区别是表药是库存,另一个是发票记录rd!这段代码是我的错误逻辑,现在我将修改只需要一个查询的代码:p尽管我将要更改代码,但我将来可能仍然需要它。为什么这段代码不起作用或所有其他建议?谢谢你的建议,但现在控件没有进入foreach循环!实际上两个表是相同的!差异erence是Table Medicine,另一个是invoice record!这段代码是我的错误逻辑,现在我将修改我的代码,只需要一个查询:p尽管我要更改代码,但我将来可能需要它。为什么这段代码不起作用或其他所有建议?谢谢你的建议,但现在是c控件未进入t