【问题标题】:How to set DateTime equals method with Dynamic Linq in C#?如何在 C# 中使用 Dynamic Linq 设置 DateTime 等于方法?
【发布时间】:2019-08-24 03:36:52
【问题描述】:

我需要通过 DateTime 字段使用 Dynamic LINQ 过滤数据。

我正在尝试这样做:

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 + ")");

但是查询返回零记录。但是如果我设置比较方法&gt;=&lt;= 而不是==,则查询返回所需的记录数量。
也许我做错了什么?

更新:
我在这里找到了示例:https://stackoverflow.com/a/26450835/7760805,但我仍在寻找更好的解决方案。

更新:
由 Stef Heyenrath 解决。

【问题讨论】:

  • DateTimes 精确到一秒以下。尝试丢弃 datetime_field 的毫秒部分
  • @Flydog57,谢谢,它真的可以帮助我。但是如何使用动态 LINQ 忽略我的 datetime_field 的毫秒数?

标签: c# linq datetime equals dynamic-linq


【解决方案1】:

根据您需要的准确度,您可以将&gt;=&lt; 运算符一起使用,如下所示:

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);

【讨论】:

  • 非常感谢!这正是我需要的!
【解决方案2】:

您应该将一个字符串传递给 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 的参数为string 类型。
  • @VladiSlav 已更新以符合您的逻辑。在我看来,MyMethod 应该接受一个 DateTime 对象并在那里截断毫秒。
  • 我需要使用Dynamic LINQ,因为我在MyClass中有几个字段,除了DateTime之外可以是字符串,整数等。所以MyMethod需要把where子句作为字符串,而不是搜索值。
【解决方案3】:

MyMethod 的内容是什么?

尝试使用 $ 字符串生成器。

MyMethod($"datetime_field == {new DateTime(dt.Year, dt.Month, dt.Day, dt.Hour, dt.Minute , dt.Second)}");

MyMethod($"datetime_field == {dt.ToString())}");

我认为这是您的逻辑问题,而不是您如何构造或传递 datetime 参数。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-09-12
  • 1970-01-01
  • 1970-01-01
  • 2011-06-18
  • 1970-01-01
  • 1970-01-01
  • 2013-06-15
相关资源
最近更新 更多