C# 如何获得包含两个其他列值的两个计算器的DataTable行的索引?
对于我的申请: 我有两个数据表,我想将第一个数据表过滤到第二个数据表。为此,我从第一个数据表中获取user和modul列,如果第二个数据表中不存在,我将添加一个新行 这是我的第二个数据表中的结构: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 | 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;
}