首页 > 解决方案 > 查找一个列表中具有与另一个对象列表中的属性匹配的属性的所有对象

问题描述

问题

我正在尝试ModelA使用另一个表(基于 ModelB)查询一个表(基于)。对于此示例,这些模型进行了简化。我需要将结果保留为IQueryable,因此更改为Enumerableor Listare not 选项。不过,我尝试添加.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; }
}

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

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

标签: linqasp.net-coreentity-framework-coreef-core-3.1

解决方案


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

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 并且我检查了空值


推荐阅读