我有一个带字符串列的数据库,用以下格式表示日期时间值:yyyyMMdd。
例如,值20160908表示2016年9月08日。
我有两个datetimepicker用于过滤dateFrom和dateTo值。我使用这个简单的代码在我的datepicker文本框中获取日期时间值:
DateTime dataFromSel = Convert.ToDateTime(txtDatFrom.Text);
DateTime dataToSel = Convert.ToDateTime(txtDatTo.Text);
我的查询是:
var query = from c in snd.WineOWines.OrderByDescending(x => x.DDT_DATA)
select new
{
c.ID,
c.VABRMA,
c.VABNCL,
c.DDT_DATA,
};
如果我有日期时间过滤器,请添加以下代码:
if (txtDatDa.Text != "")
{
string dataDaSel = Convert.ToDateTime(txtDatDa.Text).ToString("yyyyMMdd");
int dataDa = Convert.ToInt32(dataDaSel);
query = query.Where(x => int.Parse(x.DDT_DATA) >= dataDa);
}
问题是我无法在过滤器之前列出查询,因为我有很多行,如果我使用这个查询,我就无法在LINQ语句中执行int.parse。 / p>
如果列中的值是字符串,我怎样才能编写一个LINQ语句来选择数据库中的行,日期时间介于from和to之间?现在我的查询工作正常,但我需要一个where子句来解决这个问题
感谢所有
答案 0 :(得分:2)
如果日期具有相同的格式,则无需将它们转换为int。 你应该能够比较蜇伤并移除演员...
if (!string.IsNullOrEmpty(txtDatDa.Text))
{
string dataDaSel = Convert.ToDateTime(txtDatDa.Text).ToString("yyyyMMdd");
var res = query.Where(x => string.Compare(dataDaSel, x.Name) <= 0);
}
Linq to SQL支持string.Compare(string,string),如此处所述 https://social.msdn.microsoft.com/Forums/en-US/98180ae0-4ccd-4ecd-89d5-576a04169219/linq-to-entities-with-string-comparison?forum=adodotnetentityframework
答案 1 :(得分:1)
你不必放int.Parse
,你可以做一个直接的字符串比较,它会正常工作。您不必将dataDaSel
转换为整数。
if (txtDatDa.Text != "")
{
string dataDaSel = Convert.ToDateTime(txtDatDa.Text).ToString("yyyyMMdd");
query = query.Where(x => x.DDT_DATA >= dataDaSel);
}
E.g。
"20120201" >= "20120201" // true
"20120101" >= "20120201" // false
"20120301" >= "20120201" // true
只要您将格式保留为yyyyMMdd
,即使使用字符串也可以正常工作。