C# 在执行select子句之前检查列是否存在
我在来自sql的foreach循环中使用C# 在执行select子句之前检查列是否存在,c#,sql,linq,datatable,C#,Sql,Linq,Datatable,我在来自sql的foreach循环中使用DataTable,如下所示: foreach(var i in tasks) { // query sql var timeOfTasks = db.GetTableBySQL($"exec usp_Get_WorkedProyectTime @TaskTypeCategoryId = '{i.TaskTypeCategoryId}', @TaskId= '{i.TaskId}'"); // read columns
DataTable
,如下所示:
foreach(var i in tasks)
{
// query sql
var timeOfTasks = db.GetTableBySQL($"exec usp_Get_WorkedProyectTime @TaskTypeCategoryId = '{i.TaskTypeCategoryId}', @TaskId= '{i.TaskId}'");
// read columns (different rows have different columns)
var progressToBackCheck = (from DataRow dr in timeOfTasks.Rows select dr["ProgressToBackCheck"]).FirstOrDefault();
var backcheckToCorrection = (from DataRow dr in timeOfTasks.Rows select dr["BackcheckToCorrection"]).FirstOrDefault();
var correctionsToCompleted = (from DataRow dr in timeOfTasks.Rows select dr["CorrectionsToCompleted"]).FirstOrDefault();
var progressToCompleted = (from DataRow dr in timeOfTasks.Rows select dr["ProgressToCompleted"]).FirstOrDefault();
}
并非所有任务结果都具有相同的数据行。并且每行并不包含所有字段。在使用查询之前,是否有方法检查结果中是否存在列?您可以尝试使用检查数据表中是否存在列
if (timeOfTasks.Columns.Contains("ProgressToBackCheck"))
{
}
您可以使用此linq获取字段,添加where
linq
where timeOfTasks.Columns.Contains("ProgressToBackCheck")
像这样
var progressToBackCheck = (
from DataRow dr in timeOfTasks.Rows
where timeOfTasks.Columns.Contains("ProgressToBackCheck")
select dr["ProgressToBackCheck"]
).FirstOrDefault();
我在想,在这种情况下是否可以使用
切换框
?在您的情况下,我会使用If
而不是切换框
,因为每个列检查都应该是独立的。我在使用Contains
时遇到问题,它要求我输入主键,所以我这样做:timeOfTasks.PrimaryKey=new DataColumn[]{timeoftask.Columns[“ProgressToBackCheck”]};
但其他列也有同样的问题,因为如果一列不存在,我无法设置主列