从单独数据库中的表中获取多个字段匹配的记录

时间:2016-09-23 22:43:48

标签: c# sql-server entity-framework linq linq-to-sql

我正在使用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中,但有没有更好的方法来检索过滤结果而不先获取整个条形列表?

2 个答案:

答案 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上下文中提供。

TSQL: Create a view that accesses multiple databases