C# C中SQL查询与linq to datatable的等效代码是什么?

C# C中SQL查询与linq to datatable的等效代码是什么?,c#,linq,C#,Linq,这是我在T-SQL中的查询,我想在C中使用linq to datatable做同样的事情 select @found = MorningIsWorking, @Sh_startTime = MorningStart, @Sh_endTime = MorningEnd from t where t.plannum = @pn and t.Date = @datepart and (@timepart between MorningSta

这是我在T-SQL中的查询,我想在C中使用linq to datatable做同样的事情

select
    @found = MorningIsWorking, 
    @Sh_startTime = MorningStart, 
    @Sh_endTime = MorningEnd 
from t 
where 
    t.plannum = @pn and 
    t.Date = @datepart and 
    (@timepart between MorningStart and MorningEnd)
哪个MorningIsWorking是布尔值,MorningStart和MorningEnd,@timepart是时间,@datepart是日期时间

编辑

这就是我所做的,但我不知道它是否正确,以及如何在变量中获得想要的值

var res = from row in dt.AsEnumerable()
                  where row.Field<string>("plannum") == "995" &
                  row.Field<DateTime>("date") == Convert.ToDateTime("2016-08-25 10:25:00").Date &
                  Convert.ToDateTime(timepart) >= row.Field<DateTime>("MorningStart") &
                  Convert.ToDateTime(timepart) < row.Field<DateTime>("MorningEnd")
                  select row;

我相信这是根据你提供的信息,你正在努力实现的目标的关键

DateTime timepart = new DateTime(2017,2,7);
DateTime datepart = new DateTime(2016, 8, 25, 10, 25, 0);
string plannum = "995";

using (DataSet1 dt = new DataSet1())
{
     var res = from row in dt.t.AsEnumerable()
          where row.plannum == plannum &&
          row.Date == datepart &&
          timepart >= row.MorningStart &&
          timepart < row.MorningEnd
          select row;

     foreach (var row in res)
     {
          var found = row.MorningIsWorking;
          var shStartTime = row.MorningStart;
          var shEndTime = row.MorningEnd;
     }
}
或者,如果您只希望返回一行,那么可以省略foreach循环,如下所示

DateTime timepart = new DateTime(2017,2,7);
DateTime datepart = new DateTime(2016, 8, 25, 10, 25, 0);
string plannum = "995";

using (DataSet1 dt = new DataSet1())
{
     var res = (from row in dt.t.AsEnumerable()
          where row.plannum == plannum &&
          row.Date == datepart &&
          timepart >= row.MorningStart &&
          timepart < row.MorningEnd
          select row).Single();


     var found = res.MorningIsWorking;
     var shStartTime = res.MorningStart;
     var shEndTime = res.MorningEnd;
}

我使用了这个代码,它对我有效

DataRow row = dt.AsEnumerable().FirstOrDefault
            (r => (DateTime)r["date"] == timeToCompare.Date
            & r.Field<string>("plannum") == "0995" &
            tp >= r.Field<TimeSpan>("MorningStart") &
            tp < r.Field<TimeSpan>("MorningEnd"));

您能显示您已经尝试过的内容和不起作用的内容吗?@L-Four问题已编辑。根据数据集的大小,我相信在数据库中执行查询比选择整个表然后用C进行筛选要高效得多。或者,我会将datatable中的每一行强制转换为一个类型化对象,这将使使用linq进行筛选更容易。@Anth12 datatable没有超过30行。dt.MyData中的MyData是什么。这只是我已设置的测试表的名称。您可以将其更改为表的任何名称。在上面发布的SQL中,表名是t,因此,您可以将MyData替换为t。为了更加清晰,我编辑了代码示例以显示t的表名。在dot之后向dt添加任何内容时会出现错误:错误6'System.Data.DataSet'不包含't'的定义,并且没有扩展方法't'接受类型为'System.Data.DataSet'的第一个参数。是否缺少using指令或程序集引用?DataSet1是数据集的名称。上面的示例中没有包含数据集的名称,因此我使用默认名称创建了一个数据集。您需要将DataSet1更改为数据集的实际名称。
sh_starttime = row["MorningStart"].ToString();