从2个相似的表中选择所有行

时间:2017-08-04 16:48:58

标签: c# linq join gridview

我们的DB Designer承包商有一个包含表格的数据库:ActualUses和一个中间/临时表:EstimatedUses。除PK外,表格完全相同。 (ActualUses的ActualUsesKey和EstimatedUses的EstimatedUsesKey)。所有其他列都匹配名称和数据类型。

我的任务是在GridView中显示两个表中的所有行。

这些表链接到几个其他表来拉取ID的名称,所以我必须在使用LINQ时创建一个匿名类型。有没有办法在一个LINQ查询中提取我想要的东西,或者我必须做一些事情,比如单独抓取每个表,将它们加载到DataTable然后将该表绑定到GridView?

2 个答案:

答案 0 :(得分:1)

Union(使用C#Interactive窗口):

> public class AClass { public string A { get; set; } public int B { get; set; } }
> public class BClass { public string A { get; set; } public int C { get; set; } }
> var x = new List<AClass> { new AClass { A = "a", B = 1 }, new AClass { A = "B", B = 2 } };
> var y = new List<BClass> { new BClass { A = "C", C = 3 }, new BClass { A = "D", C = 4 } };
> var z = (from item in x select new { A = item.A, B = item.B }).Union(from item in y select new { A = item.A, B = item.C });
> z
UnionIterator { \{ A = "a", B = 1 }, \{ A = "B", B = 2 }, \{ A = "C", B = 3 }, \{ A = "D", B = 4 } }

您应该能够根据您的具体情况进行调整。

答案 1 :(得分:0)

您需要创建一个ViewModel类,以包含表列的表示形式,以便在LinQ查询上使用Join,如果您想要逐列多行,则需要使用Group By。我还建议稍后为ViewModel制作显示信息。

元数据:

public class TablesMetadata{
    [Display(Name = "Field 1")]
    public int table1Field1 { get; set; }

    [Display(Name = "Field 2")]
    public string table2Field1 { get; set; }

    [Display(Name = "Field 3")]
    public double table3Field1 { get; set; }
}

视图模型:

[MetadataType(typeof(TablesMetadata))]
public class TablesViewModel{
    public int table1Field1{ get; set; }
    public string table2Field1 { get; set; }
    public double table3Field1 { get; set; }
}

然后在你的控制器中:

IQueryable<TablesViewModel> tables = (from t1 in context.table1
                                      from t2 in context.table2
                                      from t3 in context.table3
                                      from au in context.ActualUses
                                      join eu in context.EstimadedUses on au.ActualUsesKey equals eu.EstimatedUsesKey
                                      where //where clause
                                      select new TablesViewModel{
                                          table1Field1 = t1.table1Field1,
                                          table2Field1 = t2.table2Field1,
                                          table3Field1 = t3.table3Field1
                                      });

return View(tables.ToList());

然后,您的View类型将是ViewModel的全名:

@model IEnumerable<namespace.Models.ViewModels.TablesViewModel>