0

我需要知道我是否能得到线索。我正在尝试构建一个表达式树,该表达式树通过 ODP.NET 托管驱动程序(当前版本)通过实体框架 6(LINQ to Entities)评估到适当的 Oracle 语句,以执行过滤。这非常适用于 string <> nvarchar2 数据类型。包含搜索的输出类似于:

Select * 
[...]
FROM "MYSCHEMA"."MYTABLE" "Extent1"
WHERE ("Extent1"."ANVARCHAR2COLUM" LIKE '%givenStrValueToFind%') 

现在我想为 DateTime <> Timestamp(6) 获得相同的结果,因为这行 sql 语句对 oracle 查询有效并返回所有包含“08”的日期:

select * from "MYSCHEMA"."MYTABLE" where ATIMESTAMP6COLUMN like '%08%';

由于我是表达式树的新手,我首先需要知道(在谷歌搜索并尝试过这个和那个之后),在我深入研究之前这是否可能。如果是这样,如何才能最好地做到这一点?由于没有为 DateTime 和 DateTime 定义包含方法?也许提供扩展方法?而且我不想直接对数据库执行查询。

任何提示都可以很好地“解开”给定的数据库数据类型……谢谢。

4

2 回答 2

0

我不知道我是否理解。无论如何,您不需要构建表达式树来避免内存中的数据库负载。LINQ 从表达式构建表达式树,EF 将表达式树转换为 SQL 语句(使用 EF 提供程序),然后在数据库上运行查询。

在您的情况下,LINQ 查询应该是这样的

myContext.MYTABLE.Where(e => e.ATIMESTAMP6COLUMN.Contains("08").ToList();

编辑

转换:

您可以使用 .ToString()。它应该是一个规范函数(每个 EF 提供程序都可用的函数)。

其他与日期时间相关的功能:

您可以查看其他规范函数(有一些关于允许检索日期部分的日期)以及非规范函数(仅在 EF Provider for oracle 中实现的函数)。

参考:

规范函数https://msdn.microsoft.com/en-us/library/vstudio/bb738626(v=vs.100).aspx

实际上我找不到 Oracle 的非规范函数。
如果你需要它,最好的办法是你问另一个问题。

于 2015-08-18T10:55:37.123 回答
0

对于 EF 6,您可以使用:

ctx.MYTABLE.Where(x=>x.ATIMESTAMP6COLUMN.ToString().Contains("08")).ToList();

这转化为

SELECT 
[Extent1].[some property name] AS [some property name], 
[Extent1].[ATIMESTAMP6COLUMN] AS [ATIMESTAMP6COLUMN], 
.
.
.
FROM [dbo].[MYTABLE] AS [Extent1]
WHERE  CAST( [Extent1].[ATIMESTAMP6COLUMN] AS nvarchar(max)) LIKE N'%08%'

据我所知,所有版本的 EF 都不支持字符串函数,但 EF 6.x 支持这种函数(我测试的 EF 是 EF 6.1.3,测试是使用 sql server localdb 作为 DBMS 完成的)。

于 2015-08-18T12:52:12.283 回答