查找一个列表中具有 属性 且与另一对象列表中的 属性 相匹配的所有对象

Find all objects in one list that have a property that matches a property in another list of objects

问题

我正在尝试使用另一个 table(基于 ModelB)来查询 table(基于 ModelA)。本示例简化了这些模型。我需要将结果保持为 IQueryable,因此更改为 EnumerableList 不是选项。不过,我尝试添加 .ToList() 但得到了同样的错误。

MyId 从一个列表中提取到字符串列表中(以便使用 Contains())不是一种选择,因为 MyIds 可能太多( > 40k) 导致错误指示操作 运行 资源不足,我猜这指的是 RAM。

错误

InvalidOperationException: The LINQ expression ... could not be translated. Either rewrite the query in a form that can be translated, or switch to client evaluation explicitly by inserting a call to either AsEnumerable(), AsAsyncEnumerable(), ToList(), or ToListAsync().

模型A

public class ModelA
{
    public string MyId { get; set; }
    public string MyName { get; set; }
}

模型B

public class ModelB
{
    public string MyId { get; set; }
    public string MyName { get; set; }
}

尝试

var results = context.ModelA
            .Where(a => ModelB.All(b => b.MyId == a.MyId));

有什么方法可以成功完成?

您可以尝试检查第二个列表是否包含 'Any()' 个匹配 ID

var results = context.ModelA
        .Where(a => ModelB.Where(b => b.MyId == a.MyId).Any());

或者您可能想尝试加入

https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/join-clause

var results = context.ModelA
    .Where(a => ModelB.
            Any(b => b!= null  && b.id != null 
                  && a!=null && a.id!==null && 
                  b.MyId == a.MyId));

我有 Select 而不是 Where 并且我检查了空值

有几种方法可以实现,这里有两种方法供大家参考:

var result = (from a in context.ModelA
                      join b in context.ModelB
                      on a.MyId equals b.MyId
                      select a);

或者你可以试试这个方法:

 var result = context.ModelA.Join(_context.ModelB,
                        x => x.MyId,
                        y => y.MyId,
                       (x, y) => x);

详情可参考this link

你可以试试这个:

var results = ctx
    .ModelAs
    .Where(ma => ctx.ModelBs.Any(mb => mb.MyId == ma.MyId));

我用过你的模型,这是我的DbContext:

public class MockContext : DbContext
{
    public MockContext(DbContextOptions<MockContext> options)
        : base(options)
    { }

    public DbSet<ModelA> ModelAs { get; set; }
    public DbSet<ModelB> ModelBs { get; set; }
}

我用来测试的数据是:

模型A:

MyId | MyName

1 Nettie Koch 
2 Karl Kuvalis 
3 Marcus Weissnat 
4 Shannon Hettinger 
5 Wilma Kuvalis 
6 Benny Brown 
7 Amanda Maggio 
8 Claude Kohler 
9 Dawn Ritchie 
10 Alan Ruecker

模型B:

MyId | MyName

5 Francis Konopelski 
6 Mandy Yost 
7 Marsha Parisian 
8 Crystal Mayer 
9 Sergio Crona 
10 Kenny Rice 
11 Levi Gutkowski 
12 Brandon Haley 
13 Jan Kunze 
14 Rafael Blanda 

结果:

MyId | MyName

5 Wilma Kuvalis 
6 Benny Brown 
7 Amanda Maggio 
8 Claude Kohler 
9 Dawn Ritchie 
10 Alan Ruecker 

您可能正在寻找 Any() 如下所示

var results = context.ModelA.Where(a => ModelB.Any(b => b.MyId == a.MyId));