C# 在数据表中搜索项目的有效方法

C# 在数据表中搜索项目的有效方法,c#,C#,我有一个datatable,它有两个字段,示例如下所示 Field A Field B 0100 0300 0800 1122 5000 6000 这些都表示范围,即0100-0300,我想选择(如果有)在其边界内具有输入范围的行,即如果输入范围为0820-0900,则从上表中选择第2行 我的问题是,有没有有效的方法来实现这一点,而不是逐个查看数据表,直到找到匹配项 这两个部分都应在定义的范围内 我必须执行数千次这个过程,而查找集很小,因此我将查找数据放在一个

我有一个datatable,它有两个字段,示例如下所示

Field A   Field B
0100      0300
0800      1122
5000      6000
这些都表示范围,即0100-0300,我想选择(如果有)在其边界内具有输入范围的行,即如果输入范围为0820-0900,则从上表中选择第2行

我的问题是,有没有有效的方法来实现这一点,而不是逐个查看数据表,直到找到匹配项

这两个部分都应在定义的范围内

我必须执行数千次这个过程,而查找集很小,因此我将查找数据放在一个数据表中,现在希望查询该数据表,而不必调用数据库数千次。这是一种正确的方法还是最好调用服务器?

尝试以下方法之一:

  1.  DataRow[] result = table.Select("FieldA >= 100 AND FieldA<= 300");
  2.  // Create a DataView
      DataView dv = new DataView(dt);
      dv.RowFilter = "FieldA >= 100 AND AND FieldA<= 300";
      // dv will now have filtered rows only and you can use it as source
1。DataRow[]结果=表格。选择(“FieldA>=100,FieldA=100,FieldA尝试以下选项之一:

  1.  DataRow[] result = table.Select("FieldA >= 100 AND FieldA<= 300");
  2.  // Create a DataView
      DataView dv = new DataView(dt);
      dv.RowFilter = "FieldA >= 100 AND AND FieldA<= 300";
      // dv will now have filtered rows only and you can use it as source

1.DataRow[]result=table。选择(“FieldA>=100和FieldA=100和FieldA如果您已经从数据库加载了数据表,那么您可以使用多种方法直接使用内存中已有的数据表筛选值。(在这种情况下,再次转到数据库没有意义)

DataTable.Select方法非常简单

string test = "0820-0900";
string[] parts = test.Split('-');
DataRow[] rows = dt.Select("FieldA <= '" + parts[0] + 
                           "' AND FieldB >= '" + parts[1] + "'");
foreach(DataRow r in rows)
    Console.WriteLine(r.Field<string>("FieldA") + "-" + r.Field<string>("FieldB"));
string test=“0820-0900”;
string[]parts=test.Split('-');
DataRow[]rows=dt.Select(“FieldA=”+“parts[1]+”);
foreach(行中的数据行r)
Console.WriteLine(r.Field(“FieldA”)+“-”+r.Field(“FieldB”));
林克之路

var result = dt.AsEnumerable()
               .Where(x => string.Compare(x.Field<string>("FieldA"),parts[0]) <= 0 && 
                           string.Compare(x.Field<string>("FieldB"),parts[1]) >= 0).ToList();
var result=dt.AsEnumerable()
其中(x=>string.Compare(x.Field(“FieldA”),parts[0])=0.ToList();
但是所有这些方法都有一个问题,因为字符串“1111”的字母顺序低于字符串“3”,因此,如果字段中的数据具有可变字符串长度,则需要在数据开头和用于检查数据表内容的字符串中添加零。这将使代码更加复杂,并且在工作结束时很难维护和测试代码

解决方案是将数据库字段更改为数字,然后可以使用简单的比较来提取所需范围内的值

string test = "0820-0900";
string[] parts = test.Split('-');
DataRow[] rows = dt.Select("FieldA <= " + Convert.ToInt32(parts[0]) + 
                           " AND FieldB >= Convert.ToInt32(parts[1]));
foreach(DataRow r in rows)
    Console.WriteLine(r.Field<string>("FieldA") + "-" + r.Field<string>("FieldB"));
string test=“0820-0900”;
string[]parts=test.Split('-');
DataRow[]rows=dt.Select(“FieldA=Convert.ToInt32(parts[1]));
foreach(行中的数据行r)
Console.WriteLine(r.Field(“FieldA”)+“-”+r.Field(“FieldB”));
如果内存中没有该表,可以使用如下代码直接查询数据库

string test = "0820-0900";
string[] parts = test.Split('-');
string cmdText = "select * from table where field <= @p1 AND FieldB >= @p2";
using(SqlConnection cn = new SqlConnection(....))
using(SqlCommand cmd = new SqlCommand(cmdText, cn))
{
    cn.Open();
    cmd.Parameters.AddWithValue("@p1", Convert.ToInt32(parts[0]));
    cmd.Parameters.AddWithValue("@p2", Convert.ToInt32(parts[1]));
    using(SqlDataReader r = cmd.ExecuteReader())
    {
        DataTable dt = new DataTable();
        dt.Load(r);
    }
}
string test=“0820-0900”;
string[]parts=test.Split('-');
string cmdText=“从表中选择*,其中字段=@p2”;
使用(SqlConnection cn=新的SqlConnection(..)
使用(SqlCommand cmd=newsqlcommand(cmdText,cn))
{
cn.Open();
cmd.Parameters.AddWithValue(“@p1”,转换为32(部分[0]);
cmd.Parameters.AddWithValue(“@p2”,转换为32(第[1]部分));
使用(SqlDataReader r=cmd.ExecuteReader())
{
DataTable dt=新的DataTable();
dt.荷载(r);
}
}

如果您已经从数据库中加载了数据表,那么您可以使用多种方法直接使用内存中已有的数据表筛选值。(在这种情况下,再次转到数据库没有任何意义)

DataTable.Select方法非常简单

string test = "0820-0900";
string[] parts = test.Split('-');
DataRow[] rows = dt.Select("FieldA <= '" + parts[0] + 
                           "' AND FieldB >= '" + parts[1] + "'");
foreach(DataRow r in rows)
    Console.WriteLine(r.Field<string>("FieldA") + "-" + r.Field<string>("FieldB"));
string test=“0820-0900”;
string[]parts=test.Split('-');
DataRow[]rows=dt.Select(“FieldA=”+“parts[1]+”);
foreach(行中的数据行r)
Console.WriteLine(r.Field(“FieldA”)+“-”+r.Field(“FieldB”));
林克之路

var result = dt.AsEnumerable()
               .Where(x => string.Compare(x.Field<string>("FieldA"),parts[0]) <= 0 && 
                           string.Compare(x.Field<string>("FieldB"),parts[1]) >= 0).ToList();
var result=dt.AsEnumerable()
其中(x=>string.Compare(x.Field(“FieldA”),parts[0])=0.ToList();
但所有这些方法都有一个问题,因为字符串“1111”的字母顺序低于字符串“3”,因此,如果字段中的数据具有可变字符串长度,则需要在数据开头和用于检查数据表内容的字符串中添加零。这将使代码更加复杂,并且在工作结束时很难维护和测试代码

解决方案是将数据库字段更改为数字,然后可以使用简单的比较来提取所需范围内的值

string test = "0820-0900";
string[] parts = test.Split('-');
DataRow[] rows = dt.Select("FieldA <= " + Convert.ToInt32(parts[0]) + 
                           " AND FieldB >= Convert.ToInt32(parts[1]));
foreach(DataRow r in rows)
    Console.WriteLine(r.Field<string>("FieldA") + "-" + r.Field<string>("FieldB"));
string test=“0820-0900”;
string[]parts=test.Split('-');
DataRow[]rows=dt.Select(“FieldA=Convert.ToInt32(parts[1]));
foreach(行中的数据行r)
Console.WriteLine(r.Field(“FieldA”)+“-”+r.Field(“FieldB”));
如果内存中没有该表,可以使用如下代码直接查询数据库

string test = "0820-0900";
string[] parts = test.Split('-');
string cmdText = "select * from table where field <= @p1 AND FieldB >= @p2";
using(SqlConnection cn = new SqlConnection(....))
using(SqlCommand cmd = new SqlCommand(cmdText, cn))
{
    cn.Open();
    cmd.Parameters.AddWithValue("@p1", Convert.ToInt32(parts[0]));
    cmd.Parameters.AddWithValue("@p2", Convert.ToInt32(parts[1]));
    using(SqlDataReader r = cmd.ExecuteReader())
    {
        DataTable dt = new DataTable();
        dt.Load(r);
    }
}
string test=“0820-0900”;
string[]parts=test.Split('-');
string cmdText=“从表中选择*,其中字段=@p2”;
使用(SqlConnection cn=新的SqlConnection(..)
使用(SqlCommand cmd=newsqlcommand(cmdText,cn))
{
cn.Open();
cmd.Parameters.AddWithValue(“@p1”,转换为32(部分[0]);
cmd.Parameters.AddWithValue(“@p2”,转换为32(第[1]部分));
使用(SqlDataReader r=cmd.ExecuteReader())
{
DataTable dt=新的DataTable();
dt.荷载(r);
}
}

为什么不让你的数据库服务器为你做这件事呢?你听说过linq吗?这是一件很棒的事情,它可以帮助你编写类似SQL的查询,虽然功能没有那么强大,但足够接近。再想一想@RowlandShaw是对的,如果你能查询它,它会更好。@DarthCoder,作为记录,linq本身不会编写SQL语句或连接到数据库。为此,您需要EntityFramework或LinqToSql之类的工具。@Rowland Shaw可能没有DB服务器,他使用的是DataTables as is data Structure为什么不让您的数据库服务器为您做这件事呢?您听说过linq吗?这是一件很棒的事情,它可以帮助您编写类似SQL的查询,尽管功能没有那么强大,但已经足够接近了。再想一想@RowlandShaw是正确的,如果您可以查询它,它会更好。@DarthCoder,请注意,linq本身不会编写sql语句或连接到数据库。您需要一些