仅比较实体框架6中的datetime与odp.net Oracle 12c的时间

dvi*_*rus 9 c# linq oracle entity-framework odp.net

我正在使用oracle和Sql的实体框架6.Timespan数据类型不适用于oracle.所以我将数据类型更改为datetime.现在我想只比较日期时间与Linq查询的时间.恩.

var db0010016 = _idb0010016Rep.GetAll().Where(e => e.ExecutionTime.TimeOfDay == viewmodel.ExecutionTime).FirstOrDefault();
Run Code Online (Sandbox Code Playgroud)

在上面的示例中,e.ExecutionTime是datetime,viewmodel.ExecutionTime是时间跨度.我正在使用timeofday函数将其转换为时间跨度

上面的查询无法执行所以我使用了DbFunctions.CreateTime()函数

var db0010016 = _idb0010016Rep.FindBy(e => DbFunctions.CreateTime(e.ExecutionTime.Hour, e.ExecutionTime.Minute, e.ExecutionTime.Second) == exetime).FirstOrDefault();
Run Code Online (Sandbox Code Playgroud)

以上ex exetime是timespan.still我得到低于错误

{"Invalid parameter binding\r\nParameter name: ParameterName"}
Run Code Online (Sandbox Code Playgroud)

kar*_*ara 1

由于 Oracle 的日期和时间问题,我们仅使用字符串:

using(MyDbContext ctx = new MyDbContext())
{
    TimeSpan myTime = new TimeSpan(12, 00, 00);
    string myTimeString = myTime.ToString("hh':'mm':'ss");
    List<ExecutionObjects> tmp = ctx.ExecutionObjects.Where(a => a.ExecutionTime.EndsWith(myTimeString)).ToList();

    // Access field in source with seperated DateTime-property.
    tmp.ForEach(e => Console.WriteLine(e.ExecutionTimeDateTime.ToShortDateString()));
}
Run Code Online (Sandbox Code Playgroud)

在源中,您可以添加 DateTime-parsing-property:

public class ExecutionObject
{
    [Column("ColExecutionTime")]
    public string ExecutionTime { get; set; }
    [NotMapped]
    public DateTime ExecutionTimeDateTime {
        get
        {
            return DateTime.ParseExact(this.ExecutionTime, "yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture);
        }
        set
        {
            this.ExecutionTime = value.ToString("yyyy-MM-dd HH:mm:ss");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

不是最漂亮的版本,但可以工作。

这是 DbFunctions 中基于 Oracle 的问题。如果激活 sql-log,您将看到使用了未知的函数“CREATETIME()”。

激活sql-log:ctx.Database.Log = Console.WriteLine;

日志将如下所示:

SELECT *
  FROM "ExecutionTimes" "Extent1"
 WHERE ((((CREATETIME (EXTRACT (HOUR FROM (CAST (
[...]
Run Code Online (Sandbox Code Playgroud)