C# 如何获得包含两个其他列值的两个计算器的DataTable行的索引?

C# 如何获得包含两个其他列值的两个计算器的DataTable行的索引?,c#,asp.net,linq,datatable,rows,C#,Asp.net,Linq,Datatable,Rows,对于我的申请: 我有两个数据表,我想将第一个数据表过滤到第二个数据表。为此,我从第一个数据表中获取user和modul列,如果第二个数据表中不存在,我将添加一个新行 这是我的第二个数据表中的结构: User | Modul | Time | Department | Status 我想检查两列(User和Modul)是否存在第二个数据表中具有此值的行。如果条目存在,我需要行索引。我怎样才能和Linq一起做到这一点? 我的第二个数据表的名称是analysis_table 这是我的代码: pri

对于我的申请:

我有两个数据表,我想将第一个数据表过滤到第二个数据表。为此,我从第一个数据表中获取user和modul列,如果第二个数据表中不存在,我将添加一个新行

这是我的第二个数据表中的结构:

User | Modul | Time | Department | Status 
我想检查两列(User和Modul)是否存在第二个数据表中具有此值的行。如果条目存在,我需要行索引。我怎样才能和Linq一起做到这一点? 我的第二个数据表的名称是analysis_table

这是我的代码:

private static DataTable FilterDataTable(DataTable nofilter_datatable) 
        {
            DataTable analyse_table = new DataTable("Filter_Analyse");

            DataColumn User = new DataColumn("User", typeof(string));
            DataColumn Modul = new DataColumn("Modul", typeof(string));
            DataColumn TIME = new DataColumn("TIME", typeof(string));
            DataColumn Department = new DataColumn("Department", typeof(string));
            DataColumn Status = new DataColumn("Status", typeof(string));

            analyse_table.Columns.Add(User);
            analyse_table.Columns.Add(Modul);
            analyse_table.Columns.Add(TIME);
            analyse_table.Columns.Add(Department);
            analyse_table.Columns.Add(Status);

            foreach (DataRow nf_row in nofilter_datatable.Rows)
            {
                string user = nf_row["User"].ToString();
                string modul = nf_row["Modul"].ToString();

                string OUT = nf_row["OUT"].ToString();
                string IN = nf_row["IN"].ToString();

                bool contains_user = analyse_table.AsEnumerable()
                    .Any(row => user == row.Field<string>("User"));

                bool contains_modul = analyse_table.AsEnumerable()
                    .Any(Row => modul == Row.Field<string>("Modul"));

                if (!contains_user || !contains_modul)
                {
                    try
                    {
                        DataRow row = analyse_table.NewRow();

                        row["User"] = user;
                        row["Modul"] = modul;

                        if (OUT != string.Empty)
                        {
                            row["TIME"] = OUT;
                            row["Status"] = "OUT";
                        }
                        else if (IN != string.Empty)
                        {
                            row["TIME"] = IN;
                            row["Status"] = "IN";
                        }

                        string[] userSpli = user.Split('@');

                        row["Department"] = GetActiveDirectoryAttribute(userSpli[0], "Department", domaincontroller);

                        analyse_table.Rows.Add(row);
                    }
                    catch (Exception)
                    {

                    }

                }

                if (contains_user && contains_modul)
                {
                    //index??

                    //string status = analyse_table.Rows[0]["Status"].ToString();

                }


            }

            return analyse_table;

        }
private static DataTable FilterDataTable(DataTable nofilter\u DataTable)
{
DataTable analysis_table=新的DataTable(“Filter_analysis”);
DataColumn用户=新的DataColumn(“用户”,类型(字符串));
DataColumn Modul=新的DataColumn(“Modul”,typeof(string));
DataColumn时间=新的DataColumn(“时间”,typeof(字符串));
DataColumn Department=新的DataColumn(“Department”,typeof(string));
DataColumn状态=新的DataColumn(“状态”,类型(字符串));
分析表.列.添加(用户);
分析表.列.添加(模数);
分析表.列.添加(时间);
分析表.列.添加(部门);
分析表.列.添加(状态);
foreach(nofilter\u datatable.Rows中的DataRow nf\u row)
{
字符串user=nf_行[“user”]。ToString();
字符串modul=nf_行[“modul”]。ToString();
string OUT=nf_行[“OUT”]。ToString();
字符串IN=nf_行[“IN”]。ToString();
bool包含\u user=analysis\u table.AsEnumerable()
.Any(row=>user==row.Field(“用户”));
bool包含_modul=analysis_table.AsEnumerable()
.Any(Row=>modul==Row.Field(“modul”);
如果(!contains_user | |!contains_modul)
{
尝试
{
DataRow row=analysis_table.NewRow();
行[“用户”]=用户;
行[“模块”]=模块;
if(OUT!=string.Empty)
{
行[“时间”]=超时;
行[“状态”]=“输出”;
}
else if(IN!=string.Empty)
{
行[“时间”]=IN;
行[“状态”]=“中”;
}
字符串[]userSpli=user.Split('@');
行[“Department”]=GetActiveDirectoryAttribute(userSpli[0],“Department”,domaincontroller);
分析表格。行。添加(行);
}
捕获(例外)
{
}
}
if(包含用户和包含模块)
{
//索引??
//string status=analysis_table.Rows[0][“status”].ToString();
}
}
返回表;
}

我需要帮助。

不需要知道analysis_表中的索引,使用它可以直接找到所需的行

var rowUser = analyse_table.AsEnumerable()
                      .FirstOrDefault(row => user == row.Field<string>("User"));

var rowModul = analyse_table.AsEnumerable()
                .FirstOrDefault(Row => modul == Row.Field<string>("Modul"));

if (rowUser == null || rowModul == null)
{

   // Not exist so I add a new row 
}
if (rowUser != null && rowModul != null)
{
     string statusUser = rowUser["Status"].ToString();
     string statusModul = rowModul["Status"].ToString();

}
var rowUser=analysis_table.AsEnumerable()
.FirstOrDefault(行=>user==row.Field(“用户”);
var rowModul=analysis_table.AsEnumerable()
.FirstOrDefault(行=>modul==Row.Field(“modul”);
if(rowUser==null | | rowModul==null)
{
//不存在,因此我添加了一个新行
}
if(rowUser!=null&&rowModul!=null)
{
字符串statusUser=rowUser[“Status”]。ToString();
字符串statusModul=rowModul[“Status”].ToString();
}
但是,由于执行了两个不同的查询来搜索您的行,我们不能保证这两行是相同的。因此,您可能需要更改代码来搜索同一行中的user和modul

var rowResult = analyse_table.AsEnumerable()
                .FirstOrDefault(row => (user == row.Field<string>("User") && 
                                        modul == row.Field<string>("Modul"));

if(rowResult == null)
    // add new
else
    // read status
var rowResult=analysis_table.AsEnumerable()
.FirstOrDefault(行=>(用户==行字段(“用户”)&&
modul==行字段(“modul”);
if(rowResult==null)
//新增
其他的
//读取状态

我假设您要添加第一个表中所有缺失的行,但不在第二个表中,这些行通过两列
User
+
Modul
进行标识

您可以使用“左外部联接”在包含这些列的匿名类型上链接这两个表。这样效率更高

 var newRowsInFirst = from r1 in first_table.AsEnumerable()
                     join r2 in analyse_table.AsEnumerable()
                     on   new { User=r1.Field<string>("User"), Modul=r1.Field<string>("Modul") }
                     equals new { User=r2.Field<string>("User"), Modul=r2.Field<string>("Modul") }
                     into gj from g2 in gj.DefaultIfEmpty()
                     where g2 == null
                     select r1;

如果两次搜索都返回true,则不清楚要更新哪一行。在两次单独搜索中找到的行可能不相同。您的代码做了一些不同的操作,它只是检查是否存在任何用户或任何模块,否则将添加该行。但它不检查用户和模块是否属于同一行,是吗红色?我想要DataTable Analysis_表的行索引,其中用户列值是相同的,字符串用户和模列值是相同的,字符串模。我已经做了更新…现在你可以看到完整的方法。这段代码很好…我可以工作,但我现在测试它。
foreach(var newRow in newRowsInFirst)
{
    analyse_table.ImportRow(newRow);
    // or:
    //DataRow addedRow = analyse_table.Rows.Add();
    //addedRow.ItemArray = newRow.ItemArray;
}