如何通过实体框架在同一时间在一个foreach中显示两个表的记录?
我的表格:
我的代码:
var transfer = dbContext.tbl_Transfer.Where(a => a.GeciciServisID == x.GeciciServisID);
这两个表都有 GeciciServisID ,所以我想用 GeciciServisID 来获取它们。 然后我想处理像
这样的记录foreach(传输中的var x){}
有一种简单的方法吗?
谢谢你。
表A /表B
ABC / 1.ABS
EBS / 2. EDC
RAW / 3. HTML
然后foreach:
ABC
ABS
EBS
EDC
RAW
HTML
我认为现在我的问题很清楚...... :)
感谢。
答案 0 :(得分:3)
您可以像这样加入表格。对不起,它在VB.Net中,但有人可以根据需要将其翻译为C#:
Dim results = From ek in tbl_EkTransfer
Join t in tbl_Transfer on ek.GeciciServisId = t.GeciciServisId
Where... (what you want)
Select ek, t
For Each result in results
' ...
Next
答案 1 :(得分:3)
var results =
tbl_EkTransfer
.Join(tbl_Transfer, tt => tt.GeciciServisId, tkt => tkt.GeciciServisId,
(newtt, newtkt) => new
{
newtt,
newtkt
})
.Where(x => x.newtkt.GeciciServisId == 1); // etc
然后你会迭代:
foreach (var result in results)
{
var test1 = result.newtkt.GeciciServisId;
var test2 = result.newtt.GeciciServisId;
}
[编辑] - 根据问题的OP修正案。
<强>修订强>
这个实现是一个非常简单的多步骤方法,而不是尝试创建一个linq超级复杂的实现。从字面上看,我们采用两个IQueryable数据集并将它们添加到新的TransferClass()
。它并不复杂,纯粹是一个尝试的起点。我们不能将结构联合起来,因为它们是不同的,所以我们采用一个持有类来投射。无论如何,更新:
新的持有类(一种viewModel):
public class TransferResult
{
public int GeciciServisId { get; set; }
public int EkipID { get; set; }
public string Semt { get; set; }
public string Adres { get; set; }
public string SourceTable { get; set; }
}
实施:
// create a holding class collection
var results = new List<TransferResult>();
// add the results from first table
results.AddRange(tbl_EkTransfer.Where(x => x.GeciciServisId == 5)
.Select(x => new TransferResult()
{
GeciciServisId = x.GeciciServisId,
Adres = x.Adres,
Semt = x.Semt,
EkipID = x.EkipID,
SourceTable = "tbl_EkTransfer"
}));
// add the results from second table
results.AddRange(tbl_Transfer.Where(x => x.GeciciServisId == 5)
.Select(x => new TransferResult()
{
GeciciServisId = x.GeciciServisId,
Adres = x.Adres,
Semt = x.Semt,
EkipID = x.EkipID,
SourceTable = "tbl_Transfer"
}));
// now one row per joined result set
foreach (var result in results.OrderBy(x => x.Adres))
{
var test1 = result.Adres; // etc
}
这就是它的全部内容。这确实夺走了linq连接,但没有牺牲任何东西来实现结果。如果有更多的时间,我确信我们仍然可以使用连接并在一次点击中进行操作,但那是另一天的一篇文章......
答案 2 :(得分:2)
根据Esa的回答,我已手动转换为C#:
var results = from ek in dbContext.tbl_EKTransfer
where //...(what you want)
select ek.ServisID
var results = from t in dbContext.tbl_Transfer
where // ...(what you want)
select t.ServisID;
results = results.Union(results2);
foreach (var result in results)
{
}
<强>更新强>
我已更新示例,以显示您在更新中指定的值。为此,我假设您需要一个共享的两个共享值 - 使用共享数据类型。
如果您想要多个列,则需要将select
行替换为select new() {ek.ServisID, ek.TransferId}
,其中指定的值是您想要的值。但请注意,两个查询都需要输出完全相同的匿名类型 - 也就是说,它们必须具有相同的属性,具有相同的名称和相同的数据类型。
您可以通过新的new {ID = ek.SomeOtherColumn}