Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linq 查找一个列表中具有与另一个对象列表中的属性匹配的属性的所有对象_Linq_Asp.net Core_Entity Framework Core_Ef Core 3.1 - Fatal编程技术网

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

Linq 查找一个列表中具有与另一个对象列表中的属性匹配的属性的所有对象,linq,asp.net-core,entity-framework-core,ef-core-3.1,Linq,Asp.net Core,Entity Framework Core,Ef Core 3.1,问题 我试图使用另一个表(基于ModelB)查询一个表(基于ModelA)。本例中简化了这些模型。我需要将结果保留为IQueryable,因此更改为可枚举的或列表不是选项。尽管如此,我还是尝试添加.ToList(),但还是出现了相同的错误 将MyIds从一个列表中拉入一个字符串列表(为了使用Contains())不是一个选项,因为可能有太多的MyId(>40k)会导致一个错误,指示操作资源耗尽,我猜这是指RAM 错误 InvalidOperationException:LINQ表达式。。。无法翻

问题

我试图使用另一个表(基于ModelB)查询一个表(基于ModelA)。本例中简化了这些模型。我需要将结果保留为
IQueryable
,因此更改为
可枚举的
列表
不是选项。尽管如此,我还是尝试添加
.ToList()
,但还是出现了相同的错误

MyId
s从一个列表中拉入一个字符串列表(为了使用
Contains()
)不是一个选项,因为可能有太多的
MyId
(>40k)会导致一个错误,指示操作资源耗尽,我猜这是指RAM

错误

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

ModelA

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

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

如何才能成功完成此操作?

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

var results = context.ModelA
        .Where(a => ModelB.Where(b => b.MyId == a.MyId).Any());
或者你可能想尝试加入


我选择了“选择”而不是“位置”,并检查了空值。您可以通过以下两种方式实现此功能:

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);
有关详细信息,请参阅。

您可以尝试以下方法:

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; }
}
模式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));

var results=context.ModelA.Where(a=>ModelB.Any(b=>b.MyId==a.MyId))是,
Any
是正确的方法。谢谢。谢谢,我尝试了
加入
,成功了。由于某种原因,它比
Where
慢一点。我还必须为
ModelB
创建一个视图,以便可以从与
ModelA
相同的上下文中访问该视图(它们位于不同的数据库中)。这是一个很好的、彻底的答案,谢谢。我必须为
ModelB
创建一个视图,以便可以从与
ModelA
相同的上下文中访问它(它们位于不同的数据库中)。这两个选项都有效,但是
Join
选项比
Where
慢,所以我选择了更快的一个。我必须为
ModelB
创建一个视图,以便可以从与
ModelA
相同的上下文中访问它(它们位于不同的数据库中)。选择你的答案,因为你是第一个。正如我在评论部分提到的。您可以使用
Any()
来实现它。如果我的回答对你有帮助,别忘了接受。
MyId | MyName

5 Wilma Kuvalis 
6 Benny Brown 
7 Amanda Maggio 
8 Claude Kohler 
9 Dawn Ritchie 
10 Alan Ruecker 
var results = context.ModelA.Where(a => ModelB.Any(b => b.MyId == a.MyId));