如何在一个foreach中显示两个表记录?

时间:2013-11-29 13:38:56

标签: c# asp.net entity-framework

如何通过实体框架在同一时间在一个foreach中显示两个表的记录?

我的表格:

tables content 我的代码:

var transfer = dbContext.tbl_Transfer.Where(a => a.GeciciServisID == x.GeciciServisID);

这两个表都有 GeciciServisID ,所以我想用 GeciciServisID 来获取它们。 然后我想处理像

这样的记录

foreach(传输中的var x){}

有一种简单的方法吗?

谢谢你。

更新:

吉姆·托兰提出解决方案,但是, 我解释错了我的问题。 我的意思是,作为迁移或合并O_o两个表与代码。 例如,我们有两个表(如您所见)

表A /表B

  1. ABC / 1.ABS

  2. EBS / 2. EDC

  3. RAW / 3. HTML

  4. 然后foreach:

    • ABC

    • ABS

    • EBS

    • EDC

    • RAW

    • HTML

    我认为现在我的问题很清楚...... :)

    FINAL:

    Jim Tollan finished.

    感谢。

3 个答案:

答案 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)

ercin,根据Esa的回答,这是c#版本:

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}

中的别名来绕过不同的名称