通过在实体框架中使用 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中。我试过了,但没有。如果我的条件是不同的数据类型,则很容易过滤。有没有办法这样做?

通过在实体框架中使用 linq 提供多个 List<int> 类型条件

如果我明白你的要求,请尝试替换

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