通过在实体框架中使用 linq 提供多个 List 类型条件
本文关键字:List int 条件 类型 实体 框架 linq | 更新日期: 2023-09-27 18:33:11
我正在处理一个使用实体框架的项目。当人们点击按钮时,我想要简单的事情searchLookUpedit
我想显示根据订单中存在的公司过滤的值。 所以这是代码:
private void SearchLookUpEdit_Customer_Click(object sender, EventArgs e)
{
object [] siparisNo = new object[gridView1.RowCount];
List<Siparisler> siparisList = new List<Siparisler>();
List<int> firmaIds = new List<int>();
for (int i = 0; i < gridView1.RowCount; i++)
{
siparisNo[i] = gridView1.GetRowCellValue(i,"SiparisNo");
int sipNo = Convert.ToInt32(siparisNo[i]);
Siparisler siparis = context.Siparisler.Where(p => p.Id == sipNo).FirstOrDefault();
siparisList.Add(siparis);
firmaIds.Add(siparis.Firma_Id);
}
for (int i = 0; i < firmaIds.Count; i++)
{
int a = firmaIds[i];
firmalarBindingSource.DataSource = context.Firmalar.Where(p => p.Id == );
}
}
在这里第二个循环。假设firmaIds<int>
列表类型有 3 个值。例如,假设它们是 3、5 和 8,我希望在点击事件运行完成后,只有这 3 家公司将存在于firmalarBindingSource.DataSource
中。我试过了,但没有。如果我的条件是不同的数据类型,则很容易过滤。有没有办法这样做?
如果我明白你的要求,请尝试替换
for (int i = 0; i < firmaIds.Count; i++)
{
int a = firmaIds[i];
firmalarBindingSource.DataSource = context.Firmalar.Where(p => p.Id == );
}
跟
firmalarBindingSource.DataSource = context.Firmalar.Where(p => firmaIds.Contains(p.Id));
@Faby回答了你的问题,但我只想补充一点,你也可以优化代码的第一部分,这样你就可以使用Linq
以更实用的方式在两行代码中完成所有操作:
IEnumerable<Firmalar> firmalarDataSource = Enumerable.Range(0, gridView1.RowCount - 1)
.Select((index) =>
{
var siparisId = Convert.ToInt32(gridView1.GetRowCellValue(index, "SiparisNo"));
var siparis = context.Siparisler.FirstOrDefault(p => p.Id == siparisId);
return context.Firmalar.FirstOrDefault(f => f.Id == siparis.Firma_Id);
})
.Distinct();
firmalarBindingSource.DataSource = firmalarDataSource;
注意:这是两行,但我调整了格式以使其更具可读性;)
如果您重视性能而不是代码行,下面是一个三行示例,其中与数据库的往返次数较少:
var siparisIds = Enumerable.Range(0, gridView1.RowCount - 1)
.Select(index => Convert.ToInt32(gridView1.GetRowCellValue(index, "SiparisNo")));
var firmaIds = context.Siparisler.Where(p => siparisIds.Contains(p.Id)).Select(s => s.Firma_Id).Distinct();
firmalarBindingSource.DataSource = context.Firmalar.Where(f => firmaIds.Contains(f.Id));