我们的DB Designer承包商有一个包含表格的数据库:ActualUses和一个中间/临时表:EstimatedUses。除PK外,表格完全相同。 (ActualUses的ActualUsesKey和EstimatedUses的EstimatedUsesKey)。所有其他列都匹配名称和数据类型。
我的任务是在GridView中显示两个表中的所有行。
这些表链接到几个其他表来拉取ID的名称,所以我必须在使用LINQ时创建一个匿名类型。有没有办法在一个LINQ查询中提取我想要的东西,或者我必须做一些事情,比如单独抓取每个表,将它们加载到DataTable然后将该表绑定到GridView?
答案 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>