【问题标题】:asp.net LinqDataSource query multiple tables with joinasp.net LinqDataSource 使用连接查询多个表
【发布时间】:2018-06-03 04:59:41
【问题描述】:

我目前正在使用 LinqToSQL 开发一个 ASP.NET 4.5 应用程序。我使用asp:GridView 控件。在我的数据源查询方法中,我需要从 SQL Server 的 2 个表中查询几乎相同字段的所有数据。

我的数据库类一:

private partial class AdOld 
{
   private int PK;
   private string Text; 
}

我的数据库二类:

private partial class AdNew 
{
   private int PK;
   private string Text;
   private bool IsActive;
}

GridViewLinqDataSource1_Selecting 方法如下所示:

protected void LinqDataSource1_Selecting(object sender, LinqDataSourceSelectEventArgs e)
{
   var ctx = new MyContext();

   var result = new MyContext().AdOld;
   // I would need to add a query to select something like MyContext().AdOld.AdNew into a Model of AdOld

   e.Result = result;
}

您知道如何(从 2 个表中选择 *)在 1 个 linq 查询中查询多个表吗?除了 AdNew 表中的 IsActive 之外,我还需要这两个表的所有条目。

非常感谢!!

【问题讨论】:

  • 这两张表是什么关系?从您的课程代码中没有关系
  • 是的,实际上没有关系。我需要查询两个表的结果以在网格中显示它们。
  • 对于表AdOld 中的行,您想在IsActive 列中显示什么? UPD:告诉我们您想在网格中显示哪些列?有 2 个变体:Table1 中的列 + Table2 中的列,或 Table1 中的行(3 列)+ Table2 中的行(2 列)。

标签: c# asp.net sql-server linq


【解决方案1】:

你想做一个联盟吗?试试这样的

var ao = ctx.AdOld.Select(x => new { x.PK, x.Text})
var an = ctx.AdNew.Select(x => new { x.PK, x.Text})
var query = ao.Union(ae);

【讨论】:

    【解决方案2】:

    我将创建一个名为 OldAndNew 之类的新类,并在该类的列表中选择 2 个查询。这样,您的新类可以为新数据集提供一些唯一标识符,因为可能存在重复的 PK。

        public class OldAndNew
        {
          public int NewPK;
          public int OriginalPK;
          public string Text;
        }
    

    然后:

    int number = 0;
    var listOfBoth = new List<OldAndNew>();
                var x = AdOld.Select(y => new OldAndNew()
                {
                    NewPK = number++,
                    OriginalPK = y.PK,
                    Text = y.Text
                });
                var y = AdNew.Select(y => new OldAndNew()
                {
                    NewPK = number++,
                    OriginalPK = y.PK,
                    Text = y.Text
                });
    listOfBoth.Add(x);
    listOfBoth.Add(y);
    

    【讨论】:

    • 您可能还想添加一个属性来说明原始数据来自哪个表。
    【解决方案3】:

    试试类似的东西;

    var query = from ao in AdOld
                from an in AdNew 
                select new
                {
                    ao,
                    an
                };
    

    在你的情况下,你也可以使用Union;

    var adOld = ctx.AdOld.Select(ao => new Ad { Pk = ao.PK, Text = ao.Text }).ToList();
    var adNew = ctx.AdNew.Where(an => an.IsActive).Select(an => new Ad { Pk = an.PK, Text = an.Text }).ToList();
    var result = adOld.Union(adNew).ToList();
    
    public class Ad
    {
        public int Pk { get; set; }
    
        public string Text { get; set; }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-23
      • 1970-01-01
      相关资源
      最近更新 更多