Как удалить одну строку datatable на основе другой datatable в .net?

#c# #asp.net #.net #datatable

#c# #asp.net #.net #datatable

Вопрос:

У меня есть одна таблица данных с именем dtFirst , как показано ниже

 Fieldname              Newvalue

antenastructure        12
slno                   2
servicelevel
powersupply
  

другая таблица данных в виде dtMaster

 Mastertabe          Masterfield          infoid      zvalue     qvalue

M_seq               antenastructure       123          
M_seq               slno                  1      
M_seq               servicelevel          133
M_seq               powersupply           154
M_seq               azimheight            124
  

Чего я хочу, так это удалить строки из, dtMaster если Fieldname из dtFirst не содержит Newvalue , т.Е. здесь я хочу удалить строки, содержащие servicelevel и powersupply .Эти две большие таблицы данных, из которых я публикую небольшую часть

Комментарии:

1. Да ладно, это тривиально — вы должны быть в состоянии закодировать это самостоятельно — покажите нам свои усилия на данный момент? Просто создайте строки. Выберите в dtFirst, чтобы получить элементы без новых значений, затем выполните итерацию по dtMaster, удаляя строки без значений в dtFirst.

2. я использовал логику, упомянутую в ссылке codeproject.com/Questions/686406 / … , но ни одна из них не увенчалась успехом

Ответ №1:

Посмотрите, работает ли это

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            DataTable dtFirst = new DataTable();
            dtFirst.Columns.Add("Fieldname", typeof(string));
            dtFirst.Columns.Add("Newvalue", typeof(int));
            dtFirst.Columns["Newvalue"].AllowDBNull = true;

            dtFirst.Rows.Add(new object[] {"antenastructure", 12});
            dtFirst.Rows.Add(new object[] {"slno", 2});
            dtFirst.Rows.Add(new object[] {"servicelevel"});
            dtFirst.Rows.Add(new object[] {"powersupply"});

            string[] dtFirstValidRows = dtFirst.AsEnumerable().Where(x => x.Field<int?>("Newvalue") != null).Select(x => x.Field<string>("Fieldname")).ToArray();

            DataTable dtMaster = new DataTable();
            dtMaster.Columns.Add("Mastertabe", typeof(string));
            dtMaster.Columns.Add("Masterfield", typeof(string));
            dtMaster.Columns.Add("infoid", typeof(int));
            dtMaster.Columns["infoid"].AllowDBNull = true;
            dtMaster.Columns.Add("zvalue", typeof(int));
            dtMaster.Columns["zvalue"].AllowDBNull = true;
            dtMaster.Columns.Add("qvalue", typeof(int));
            dtMaster.Columns["qvalue"].AllowDBNull = true;

            dtMaster.Rows.Add(new object[] {"M_seq", "antenastructure", 123});          
            dtMaster.Rows.Add(new object[] {"M_seq", "slno", 1});          
            dtMaster.Rows.Add(new object[] {"M_seq", "servicelevel", 133});          
            dtMaster.Rows.Add(new object[] {"M_seq", "powersupply", 154});          
            dtMaster.Rows.Add(new object[] {"M_seq", "azimheight", 124});

            dtMaster = dtMaster.AsEnumerable().Where(x => dtFirstValidRows.Contains(x.Field<string>("Masterfield"))).CopyToDataTable();
        }
    }
}
  

Ответ №2:

Это псевдокод, введенный на моем телефоне:

 var rowsWithoutVals = dtFirst.Rows.Select("newValues = ''");

for(int i = dtMaster.Rows.Count - 1; i > -1;i--) {

 foreach (var emptyItem in rowsWithoutVals) {
  if (emptyItem[0] == dtMaster[i][1]) {
    dtMaster.Rows.RemoveAt[i];
    break;
   }
 }
}