C# 使用EF和LINQ限制查询的列表内容

C# 使用EF和LINQ限制查询的列表内容,c#,entity-framework,linq,asp.net-core,C#,Entity Framework,Linq,Asp.net Core,我想使用EF从数据库中查询数据,其中有两个约束,一个是ID,第二个是数组中某个项的状态 数据结构: TableA: { ID, TableB: { TableC: [ { Status, Name, ... }, ] } } 目前,我有以下代码: int[] IDS = new int[

我想使用EF从数据库中查询数据,其中有两个约束,一个是ID,第二个是数组中某个项的状态

数据结构:

TableA:
{
    ID,
    TableB:
    {
         TableC:
         [
         {
              Status, 
              Name, 
              ...
         },
         ]
    }
}
目前,我有以下代码:

int[] IDS = new int[3] {1, 3, 6};

TableA[] result = await context.TableA
                    .ThenInclude(x => x.TableB)
                           .ThenInclude(y => y.TableC)
                    .Where(x => IDS.Contains(x.TableB.ID) &&
                           x.TableB.TableC.Where(y => y.Status == "Awesome").Count() > 0)
                    .AsNoTracking()
                    .ToArrayAsync();

最终目标是获取id包含在数组中的项目,并仅从TableC中获取状态为Awesome的元素。目前,我得到了数组中的所有值作为结果,我知道这是可以做到的,因为我已经在SQL查询中做到了,但不知何故,我无法使用EF重现它。

看起来你非常接近了。我想这样就可以了

TableA[]result=wait context.TableA
.然后包括(x=>x.TableB)
.然后包括(y=>y.table c)
.Where(x=>IDS.Contains(x.TableB.ID)&&
x、 TableB.TableC.Status.Any(y=>y==“棒极了”)
.AsNoTracking()
.ToArrayAsync();

让我知道这是否满足您的需要。如果您还需要大于0的计数值,请将其作为另一个&&添加到where子句中。

看起来您已经非常接近了。我想这将满足您的需要

int[] IDS = new int[3] {1, 3, 6};

TableA[] result = await context.TableA
                    .Include(x => x.TableB)
                           .ThenInclude(y => y.TableC)
                    .Where(x => IDS.Contains(x.TableB.ID) &&
                           x.TableB.TableC.Any(c => c.Status== "Awesome")
                    .AsNoTracking()
                    .ToArrayAsync();
TableA[]result=wait context.TableA
.然后包括(x=>x.TableB)
.然后包括(y=>y.table c)
.Where(x=>IDS.Contains(x.TableB.ID)&&
x、 TableB.TableC.Status.Any(y=>y==“棒极了”)
.AsNoTracking()
.ToArrayAsync();
让我知道这是否满足您的需要。如果您还需要大于0的计数值,请将其作为另一个&&添加到where子句中。

尝试以下代码:

int[] IDS = new int[3] {1, 3, 6};

TableA[] result = await context.TableA
                    .Include(x => x.TableB)
                           .ThenInclude(y => y.TableC)
                    .Where(x => IDS.Contains(x.TableB.ID) &&
                           x.TableB.TableC.Any(c => c.Status== "Awesome")
                    .AsNoTracking()
                    .ToArrayAsync();
       int[] IDS = new int[3] { 1, 3, 6 };
       TableA[] result = await _context.TableA
                            .Include(x => x.TableB)
                                   .ThenInclude(y => y.TableC)
                            .Where(x => IDS.Contains(x.TableB.ID))
                            .Select(x => new TableA
                            {
                                ID = x.ID,
                                TableB = new TableB()
                                {
                                    ID = x.TableB.ID,
                                    TableC = x.TableB.TableC.Where(c => c.Status == "Awesome").ToList()
                                }
                            }).AsNoTracking()
                            .ToArrayAsync();
请尝试以下代码:

       int[] IDS = new int[3] { 1, 3, 6 };
       TableA[] result = await _context.TableA
                            .Include(x => x.TableB)
                                   .ThenInclude(y => y.TableC)
                            .Where(x => IDS.Contains(x.TableB.ID))
                            .Select(x => new TableA
                            {
                                ID = x.ID,
                                TableB = new TableB()
                                {
                                    ID = x.TableB.ID,
                                    TableC = x.TableB.TableC.Where(c => c.Status == "Awesome").ToList()
                                }
                            }).AsNoTracking()
                            .ToArrayAsync();

我非常确定
TableC
实际上是一个集合,而不是一个实例。否则他们将无法在其上执行
Where
。@juharr感谢您发现了这一点。添加了应该正确捕获该条件的Any子句。这将得到相同的结果。他们希望实际过滤掉TableCs中的值。I@juh啊,我再次阅读了这个问题后,明白我错在哪里了。他需要一个连接,我有时间的时候必须进行一点编辑。嗨!是的,TableC是一个数组,我的最终目标是从TableC的值中获得所有不同的名称,但只有那些状态为“很棒”的名称符合条件。我可以在检索数据后执行此操作,但问题是我知道在我从数据库获取数据之前可以更高效地执行此操作。我非常确定
表格c
实际上是一个集合,而不是单个实例。否则他们将无法在其上执行
Where
。@juharr感谢您的发现。添加了Any clause应该正确地捕捉到那个条件。那应该得到相同的结果。他们希望实际过滤掉TableC中的值。我@juharr我再次阅读了这个问题后,我知道我错在哪里了。他需要一个连接,我需要一点时间来编辑。嗨!是的,TableC是一个数组,我的最终目标是获得所有不同的名称s来自TableC的值,但只有状态为“Awesome”的才符合条件。我可以在检索数据后执行此操作,但我知道在从数据库获取数据之前可以更高效地执行此操作。遗憾的是,Any()不起作用,感谢您尝试不幸的是。Any()不影响,感谢您尝试不让系统做它自己的事情,手动选择我想要的值,真的有效!谢谢!所以不让系统做它自己的事情,手动选择我想要的值,真的有效!谢谢!