我正在使用LINQ,但可能会为此创建一个存储过程。我有一个工作解决方案,它检索两个记录列表,然后在内存中使用.Join()
过滤。我正在寻找对此的改进或对.Any()
失败使用的更正,因此我不需要先加载两个记录的完整列表。
情况:
我有两个不同DB的表(所以没有键/导航道具关系,我不能改变它:/)。
表1是Foos的列表。
Foo Entity Properties: ID, ..., prop1, prop2, prop3, ...
表2是一系列条形图,它们与Foo中的三个属性的唯一组合相匹配。 (prop1,prop2,prop3)有一个唯一的键。我没有使用复合主键,因为这是Web应用程序的一部分,这会使导航变得复杂。
Bar Entity Properties: ID, prop1, prop2, prop3, ...
我需要从活动的Foos中检索与组合匹配的所有条形码。
我研究了使用.Any()/ .Exists()的潜在解决方案,但它们没有用。
//This doesn't work
var foos = db1.Foos.Where(d => d.IsActive)
.Select(c => new
{
c.prop1,
c.prop2,
c.prop3,
})
.ToList();
var fooBars = db2.Bars.Where(b => foos.Any(f => f == new { b.prop1,
b.prop2,
b.prop3 }))
.ToList();
我的工作解决方案:(见下面的答案)
我认为有一种方法可以将它组合成一个查询,因为实体位于不同的DbContexts中,但有没有更好的方法来检索过滤结果而不先获取整个条形列表?
答案 0 :(得分:0)
我目前的工作解决方案:
var foos = db1.Foos.Where(d => d.IsActive)
.Select(c => new
{
c.prop1,
c.prop2,
c.prop3,
})
.ToList();
var bars = db2.Bars.ToList();
var fooBars = bars.Join(foos,
x => new { x.prop1, x.prop2, x.prop3 },
y => y,
(x, y) => x)
.ToList();
这不是理想的,因为它只会加载每个Bar(3k +记录),而我只会查找与我的活动Foos的prop组合相匹配的~200条。
如果有人有更好的解决方案,我会接受,但现在可行。
答案 1 :(得分:0)
如果您只需要加载实体。您可以在db2中创建一个链接到db1中的表的视图。该视图将在db2上下文中提供。