【问题标题】:Create a new row from 2 tables从 2 个表创建一个新行
【发布时间】:2010-06-19 23:13:25
【问题描述】:

LINQ 和 c# 新手,但遇到一个特定问题。

我有 2 个数据表。

DataTable 1 中包含名称、门牌号。 DataTable 2 包含 Street、FirstHouseNumber、LastHouseNumber。

我想要做的是创建一个新表,其中包含名称、门牌号、街道,但是当我只期望与 DataTable 1 相同的计数时,我不断得到很多 DataTable1 Count * DataTable2 Count。

这是我正在使用的表达式:

var funcquery = from name in DT1.AsEnumerable()
                from street in DT2.AsEnumerable()
                where name.Field<int>("Number") >= street.Field<int>("FirstHouseNumber") && name.Field<int>("Number") <= street.Field<int>("LastHouseNumber")
                select new { Name = name.Field<string>("Name"), Number = name.Field<int>("Number"), street.Field<string>("Street")   };

我做错了什么?我就是完全看不懂。

TIA。

【问题讨论】:

    标签: c# linq


    【解决方案1】:

    用一个更具体的例子会更容易思考:

    Name   House Number
    ------ ------------
    Chris  123
    Ben    456
    Joe    789
    
    Street   First House  Last House
             Number       Number
    -------- ------------ ------------
    Broadway 100          500
    Main     501          1000
    

    为了演示使用这些数据的结果,我使用以下代码:

    class HouseInfo
    {
       public string Name;
       public int HouseNumber;
       public HouseInfo(string Name, int HouseNumber)
       {
          this.Name = Name;
          this.HouseNumber = HouseNumber;
       }
    }
    class StreetInfo
    {
       public string Street;
       public int FirstHouseNumber;
       public int LastHouseNumber;
       public StreetInfo(string Street, int FirstHouseNumber, int LastHouseNumber)
       {
          this.Street = Street;
          this.FirstHouseNumber = FirstHouseNumber;
          this.LastHouseNumber = LastHouseNumber;
       }
    }
    static void Main(string[] args)
    {
       HouseInfo[] houses = new HouseInfo[] {
          new HouseInfo("Chris", 123),
          new HouseInfo("Ben", 456),
          new HouseInfo("Joe", 789) };
       StreetInfo[] streets = new StreetInfo[] {
          new StreetInfo("Broadway", 100, 500),
          new StreetInfo("Main", 501, 1000)};
    
       var funcquery = from name in houses
                       from street in streets
                       where name.HouseNumber >= street.FirstHouseNumber && name.HouseNumber <= street.LastHouseNumber
                       select new { Name = name.Name, Number = name.HouseNumber, Street = street.Street };
       var results = funcquery.ToArray();
       for (int i = 0; i < results.Length; i++)
       {
          Console.WriteLine("{0} {1} {2}", results[i].Name, results[i].Number, results[i].Street);
       }
    }
    

    结果是:

    Chris 123 Broadway
    Ben 456 Broadway
    Joe 789 Main
    

    这似乎是您所追求的,所以我认为问题不在于您提供的代码。也许它在数据本身(如果多条街道包括相同的房屋范围)或其他东西。您可能需要提供更具体的数据来证明您的问题。

    这是使用 DataTables 而不是类实现的相同代码。它产生相同的结果:

    System.Data.DataTable DT1 = new System.Data.DataTable("Houses");
    System.Data.DataTable DT2 = new System.Data.DataTable("Streets");
    DT1.Columns.Add("Name", typeof(string));
    DT1.Columns.Add("Number", typeof(int));
    DT2.Columns.Add("Street", typeof(string));
    DT2.Columns.Add("FirstHouseNumber", typeof(int));
    DT2.Columns.Add("LastHouseNumber", typeof(int));
    DT1.Rows.Add("Chris", 123);
    DT1.Rows.Add("Ben", 456);
    DT1.Rows.Add("Joe", 789);
    DT2.Rows.Add("Broadway", 100, 500);
    DT2.Rows.Add("Main", 501, 1000);
    var funcquery = from System.Data.DataRow name in DT1.Rows
                    from System.Data.DataRow street in DT2.Rows
                    where (int)name["Number"] >= (int)street["FirstHouseNumber"]
                    && (int)name["Number"] <= (int)street["LastHouseNumber"]
                    select new { Name = name["Name"], Number = name["Number"], Street = street["Street"] };
    var results = funcquery.ToArray();
    for (int i = 0; i < results.Length; i++)
    {
       Console.WriteLine("{0} {1} {2}", results[i].Name, results[i].Number, results[i].Street);
    }
    

    【讨论】:

      猜你喜欢
      • 2017-01-29
      • 1970-01-01
      • 2012-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-25
      • 1970-01-01
      • 2023-03-17
      相关资源
      最近更新 更多