1

我有一个查询:

model.Queue = _db.Orders
                .Join(_db.Tool,
                    a => a.PART_KEY,
                    b => b.PART_KEY,
                    (a, b) => new { a, b })
                .Where(r => (r.a.PART_KEY == r.b.PART_KEY) && (r.b.Site == Site))
                .Where(r => (r.a.Start > 0) && (r.a.Finish == 0))
                .GroupBy(r => new { r.a.GROUP })
                .Select(r => new Queue
                {
                    name = r.Key.GROUP,
                    count = r.GroupBy(g => g.a.PART_KEY).Count(),
                    average = r.Average(g => g.a.DaysInSequence)
                });

该查询当前用于为用户生成指标。用户现在希望扩展指标以包含表中已完成的订单OrdersCompleted。在数据库中,当一个订单完成时,整个订单会从 移动OrdersOrdersComplete。两个表具有相同的结构,即相同的列和相同的模型类。

看起来我需要使用的扩展方法 is Concat,但我在弄清楚语法以使其与此特定查询一起使用时遇到问题。似乎添加.Concat(_db.OrdersComplete)为第一个扩展方法应该可以工作,但似乎并非如此。

4

2 回答 2

2

问题在于,即使两个表具有完全相同的列,具有完全相同的类型和名称,生成类的工具也会创建两个具有不同名称的类型。由于类型不完全相同Concat因此不起作用。您需要做一些事情来映射一个或两个表,以便它们共享一个类型。

一种选择是将它们都映射到匿名类型。添加类似:

.Select(o => new
{
    o.PART_KEY,
    o.GROUP
    //Any other columns you need from each order
});

在两者_db.Orders以及之后_db.OrdersComplete。然后Concat意志起作用。

另一种选择是,如果您认为需要处理所有组合订单很常见,则可以解决数据库类不相关的潜在问题。您可以修改实际的 DB 对象,以便在所有查询中更轻松。

一种选择是创建两个类都可以扩展/实现的接口或基类型。如果您使用两种类型共享的所有列创建一个接口,并让它们都实现该接口,那么您可以使用它Concat来创建该接口的枚举。(但不确定它与 Linq-To-Sql 的效果如何。)

第三种选择是在数据库中创建一个视图,在后台,它只是Union All这两个表上的一个,可能从一个或两个表中提取列的子集。然后,您可以查询该视图,而不是自己连接表。

于 2013-01-07T18:20:00.040 回答
0

Servy 的回答是正确的:最简单的方法是从两个查询中的每一个中创建一个匿名类。只要匿名类具有相同的属性,两者都Concat可以Union工作。

一种可能的替代方法是在两个表上运行相同的查询(因为您已经将结果投影到一个新Queue对象中,以及Concat来自两个查询的结果。

于 2013-01-07T18:19:50.593 回答