C# C中SQL查询与linq to datatable的等效代码是什么?
这是我在T-SQL中的查询,我想在C中使用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
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();