查找一个列表中具有 属性 且与另一对象列表中的 属性 相匹配的所有对象
Find all objects in one list that have a property that matches a property in another list of objects
问题
我正在尝试使用另一个 table(基于 ModelB)来查询 table(基于 ModelA
)。本示例简化了这些模型。我需要将结果保持为 IQueryable
,因此更改为 Enumerable
或 List
不是选项。不过,我尝试添加 .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));
问题
我正在尝试使用另一个 table(基于 ModelB)来查询 table(基于 ModelA
)。本示例简化了这些模型。我需要将结果保持为 IQueryable
,因此更改为 Enumerable
或 List
不是选项。不过,我尝试添加 .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));