C# 向现有LINQ查询添加表

C# 向现有LINQ查询添加表,c#,asp.net-mvc,linq,C#,Asp.net Mvc,Linq,我有一个问题: 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_K

我有一个问题:

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
中的已完成订单。在数据库中,订单完成后,整个订单将从
Orders
移动到
OrdersComplete
。两个表具有相同的结构,即相同的列和相同的模型类

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

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


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

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

一个选项是将它们都映射到匿名类型。添加如下内容:

.Select(o => new
{
    o.PART_KEY,
    o.GROUP
    //Any other columns you need from each order
});
\u db.Orders
\u db.Orders完成
之后,
Concat
将工作

另一种选择是,如果您认为需要处理所有组合顺序是很常见的,那么可以解决数据库类不相关的根本问题。您可以修改实际的数据库对象,以便在所有查询中更轻松地执行此操作

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


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

不,
Union
将遇到与
Concat
。泛型强制两个序列具有相同的类型。表,除了其中的数据之外,在结构上是相同的。@Jeff,这并不重要。就编译器而言,它们仍然是不同的类型。请注意,如果
Concat
是结果,而不是开始时的表,则会导致更短、更清晰的结果呃,代码更简单,但执行两个数据库查询时,执行时间几乎要长2倍。我有一个想法,这可能就是问题所在。如果我需要所有列怎么办?我需要全部键入它们吗?或者是否有一个与LINQ的
SELECT*
等效的方法?我还考虑过在查询时更改基础数据库表实际上,我们也不喜欢这种结构,但我们的许多应用程序已经使用了这些表,只有DBA可以进行这些更改。@Jeff您需要键入该查询中使用的所有列。无法提取所有列。您不需要更改第二个选项的实际DB,只需要更改表示这些表的C#对象我想我还没有完全理解你在选项2中的意思。也许你可以编辑你的答案,把这个“界面”的一个很小的例子包括进去.我对面向对象编程和c#一般来说是相当陌生的,所以也许这就是问题所在。P.S.选项1对我很有用,但我仍然想了解更多关于选项的信息2@Jeff创建一个接口。为两个表共享的每一列指定一个属性,并为其指定适当的类型。然后只需转到每个表的类定义这些表和add使它们实现了该接口。完成后,您可以将这两个序列强制转换为
IEnumerable
(或您称之为
的任何内容)并使用
Concat`。不确定这是否可行,但听起来您的数据库确实需要重做。两个表具有相同的列几乎总是一个设计缺陷。为什么不拥有一个完整的标志列呢?@juharr在某些情况下这是有意义的。如果您很少需要访问历史数据,则可以对segre进行性能优化排除最近的订单。订单完成后也可能不可编辑,并且具有不同的表将允许不同的权限级别(在未完成的表中编辑,但在已完成的表中仅创建和不编辑/删除)。