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

use*_*284 4 linq entity-framework-core asp.net-core ef-core-3.1

问题

ModelA我正在尝试使用另一个表(基于 ModelB)查询一个表(基于 )。本例中这些模型已被简化。我需要将结果保留为IQueryable,因此更改为EnumerableList不是选项。尽管如此,我尝试添加.ToList()但遇到了同样的错误。

MyIds 从一个列表中拉出到字符串列表中(为了使用Contains())不是一种选择,因为可能有太多MyIds(> 40k)会导致错误,指示操作耗尽资源,我猜这是指的是内存。

错误

InvalidOperationException:LINQ 表达式...无法翻译。以可翻译的形式重写查询,或者通过插入对 AsEnumerable()、AsAsyncEnumerable()、ToList() 或 ToListAsync() 的调用来显式切换到客户端计算。

A型

public class ModelA
{
    public string MyId { get; set; }
    public string MyName { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

B型

public class ModelB
{
    public string MyId { get; set; }
    public string MyName { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

试图

var results = context.ModelA
            .Where(a => ModelB.All(b => b.MyId == a.MyId));
Run Code Online (Sandbox Code Playgroud)

有哪些方法可以成功完成此任务?

小智 5

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

var results = context.ModelA
        .Where(a => ModelB.Where(b => b.MyId == a.MyId).Any());
Run Code Online (Sandbox Code Playgroud)

或者您可能想尝试加入

https://learn.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));
Run Code Online (Sandbox Code Playgroud)

我选择了 Select 而不是Where,并且检查了空值