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)
由于 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)