如何在 C# 中使用 Dynamic Linq 设置 DateTime equals 方法?
How to set DateTime equals method with Dynamic Linq in C#?
我需要使用 Dynamic LINQ by DateTime 字段过滤数据。
我正在尝试这样做:
public class MyClass
{
private DateTime datetime_field;
//...
//some other fields
//...
}
public void MyMethod(string where_clause)
{
List<MyClass> myData = new List<MyClass>()
{
//...
//initialization
//...
};
var query = myData.Where(where_clause).ToList();
myDataGridView.DataSource = query;
}
// usage
string value = DateTime.Now.ToString(); // for example
if (DateTime.TryParse(value, out DateTime dt))
MyMethod("datetime_field == DateTime(" + dt.Year + ", " + dt.Month + ", " + dt.Day + ", " + dt.Hour + ", " + dt.Minute + ", " + dt.Second + ")");
但查询return零条记录。但是如果我设置比较方法 >=
或 <=
而不是 ==
,查询 returns 需要的记录数量。
也许我做错了什么?
更新:
我在这里找到了示例:,但我仍在寻找更好的解决方案。
更新:
由 Stef Heyenrath 解决。
您应该将一个字符串传递给 MyMethod 方法,然后转换为 DateTime 并删除方法中的毫秒数。
public class MyClass
{
public DateTime datetime_field; // note this needs to be public, not private
}
public void MyMethod(string strDate)
{
if (DateTime.TryParse(value, out DateTime dt))
{
List<MyClass> myData = new List<MyClass>()
{
// initialization
};
var roundedDate = new DateTime(dt.Year, dt.Month, dt.Day,
dt.Hour, dt.Minute, dt.Second);
var query = myData.Where(obj => obj.date_time == roundedDate).ToList();
myDataGridView.DataSource = query;
}
}
// usage
string value = DateTime.Now.ToString();
MyMethod(value);
MyMethod 的内容是什么?
尝试使用 $ 字符串生成器。
MyMethod($"datetime_field == {new DateTime(dt.Year, dt.Month, dt.Day, dt.Hour, dt.Minute , dt.Second)}");
或
MyMethod($"datetime_field == {dt.ToString())}");
我认为这是你的逻辑问题,而不是你构建或传递日期时间参数的方式。
根据您需要的准确性,您可以同时使用 >=
和 <
运算符,如下所示:
var date = DateTime.Now;
// accuracy is 1 day in this example
var from = date.Date;
var to = from.AddDays(1);
// If you only need to select on a day, use this:
var result = query.Where("datetime_field >= @0 && datetime_field < @1", from, to);
我需要使用 Dynamic LINQ by DateTime 字段过滤数据。
我正在尝试这样做:
public class MyClass
{
private DateTime datetime_field;
//...
//some other fields
//...
}
public void MyMethod(string where_clause)
{
List<MyClass> myData = new List<MyClass>()
{
//...
//initialization
//...
};
var query = myData.Where(where_clause).ToList();
myDataGridView.DataSource = query;
}
// usage
string value = DateTime.Now.ToString(); // for example
if (DateTime.TryParse(value, out DateTime dt))
MyMethod("datetime_field == DateTime(" + dt.Year + ", " + dt.Month + ", " + dt.Day + ", " + dt.Hour + ", " + dt.Minute + ", " + dt.Second + ")");
但查询return零条记录。但是如果我设置比较方法 >=
或 <=
而不是 ==
,查询 returns 需要的记录数量。
也许我做错了什么?
更新:
我在这里找到了示例:,但我仍在寻找更好的解决方案。
更新:
由 Stef Heyenrath 解决。
您应该将一个字符串传递给 MyMethod 方法,然后转换为 DateTime 并删除方法中的毫秒数。
public class MyClass
{
public DateTime datetime_field; // note this needs to be public, not private
}
public void MyMethod(string strDate)
{
if (DateTime.TryParse(value, out DateTime dt))
{
List<MyClass> myData = new List<MyClass>()
{
// initialization
};
var roundedDate = new DateTime(dt.Year, dt.Month, dt.Day,
dt.Hour, dt.Minute, dt.Second);
var query = myData.Where(obj => obj.date_time == roundedDate).ToList();
myDataGridView.DataSource = query;
}
}
// usage
string value = DateTime.Now.ToString();
MyMethod(value);
MyMethod 的内容是什么?
尝试使用 $ 字符串生成器。
MyMethod($"datetime_field == {new DateTime(dt.Year, dt.Month, dt.Day, dt.Hour, dt.Minute , dt.Second)}");
或
MyMethod($"datetime_field == {dt.ToString())}");
我认为这是你的逻辑问题,而不是你构建或传递日期时间参数的方式。
根据您需要的准确性,您可以同时使用 >=
和 <
运算符,如下所示:
var date = DateTime.Now;
// accuracy is 1 day in this example
var from = date.Date;
var to = from.AddDays(1);
// If you only need to select on a day, use this:
var result = query.Where("datetime_field >= @0 && datetime_field < @1", from, to);