Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从2个表中创建新行_C#_Linq - Fatal编程技术网

C# 从2个表中创建新行

C# 从2个表中创建新行,c#,linq,C#,Linq,LINQ和c#都是新手,但有一个特定的问题 我有两个数据表 数据表1中有名称、门牌号。数据表2包含街道、第一个房屋编号、最后一个房屋编号 我想做的是创建一个新的表,其中包含名称、门牌号、街道,但我一直以大量的DataTable1计数*DataTable2计数结束,而我只希望计数与DataTable 1相同 以下是我使用的表达: var funcquery = from name in DT1.AsEnumerable() from street in DT2.As

LINQ和c#都是新手,但有一个特定的问题

我有两个数据表

数据表1中有名称、门牌号。数据表2包含街道、第一个房屋编号、最后一个房屋编号

我想做的是创建一个新的表,其中包含名称、门牌号、街道,但我一直以大量的DataTable1计数*DataTable2计数结束,而我只希望计数与DataTable 1相同

以下是我使用的表达:

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")   };
var funcquery=来自DT1.AsEnumerable()中的名称
从DT2中的街道开始。AsEnumerable()

其中name.Field(“Number”)>=street.Field(“FirstHouseNumber”)&&name.Field(“Number”)这将更容易通过一个更具体的示例来考虑:

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);
   }
}
这似乎是你想要的,所以我认为问题不在于你给出的代码。可能是数据本身(如果多条街道包含相同的房屋范围)或其他内容。您可能需要提供更具体的数据来说明您的问题

下面是使用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);
}
System.Data.DataTable DT1=新的System.Data.DataTable(“房屋”);
System.Data.DataTable DT2=新的System.Data.DataTable(“街道”);
DT1.Columns.Add(“名称”,typeof(字符串));
DT1.列。添加(“编号”,类型(int));
DT2.Columns.Add(“Street”,typeof(string));
DT2.Columns.Add(“FirstHouseNumber”,typeof(int));
DT2.Columns.Add(“LastHouseNumber”,typeof(int));
DT1.行。添加(“克里斯”,123);
DT1.行。添加(“Ben”,456);
DT1.行。添加(“Joe”,789);
DT2.行。添加(“百老汇”,100500);
DT2.行。添加(“主”,501,1000);
var funcquery=来自DT1.Rows中的System.Data.DataRow名称
来自DT2.行中的System.Data.DataRow street
其中(内部)名称[“编号”]>=(内部)街道[“第一房屋编号”]
&&(int)名称[“编号”]
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);
}