Linq 查找一个列表中具有与另一个对象列表中的属性匹配的属性的所有对象
问题 我试图使用另一个表(基于ModelB)查询一个表(基于ModelA)。本例中简化了这些模型。我需要将结果保留为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表达式。。。无法翻
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));