我有以下查询:
"C_START>= '01/01/0001 06:00:00 PM' AND C_END <= '01/01/0001 08:00:00 PM'"
其中C_START
和C_END
是DataTable
的列名。
现在我将此查询传递为:
public static DataTable getval(query, dt)
{
DataTable myTable = new DataTable();
myTable = dt.Clone();
DataRow[] dr = dt.Select(query);
if (dr.Length > 0)
{
foreach (DataRow r in dr)
{
myTable.Rows.Add(r.ItemArray);
}
}
return myTable;
}
在myTable
中显示此GridView
时,我可以看到C_START大于或等于下午6点的所有记录的列表。 C_END有问题。它显示所有记录,包括那些C_END值大于8 PM的记录,根据传递的查询,这些记录是错误的。请建议如何消除此问题。
答案 0 :(得分:0)
我相信,您可以使用LINQ而不是DataTable.Select()
来获得更好的结果。不是将查询传递给Method,而是将其传递给您的开始/结束DateTime
并将其用于条件。当然你可以传递它的字符串,但你需要进行一些转换。
以下示例假设您的C_START
和C_END
值在DateTime
中的类型为DataTable
。
//Add more parameters based on your conditions
public static DataTable GetVal(DateTime startDate, DateTime endDate, DataTable dt)
{
using (var myTable = dt.Clone())
{
var dr = from row in myTable.AsEnumerable()
where row.Field<DateTime>("C_START") >= startDate
&& row.Field<DateTime>("C_END") <= endDate
//Add more && statements to complete the query as needed.
//A string query is OK but you are prone to mistakes, why not let the compiler do the work.
select new {row};
foreach (var row in dr)
{
myTable.Rows.Add(row);
}
return myTable;
}
}
此外,您应该考虑比GetVal
更具描述性的方法名称。此方法返回DataTable
而非值,因此我会执行GetFilteredDataSet
或FilterDataTableByDate
之类的操作。 C#中的方法名称是Camel Case而不是小写。