.NET DateTime <> Oracle Timestamp 类似搜索的表达式树
Expression Tree for .NET DateTime <> Oracle Timestamp like search
我想知道能不能得到线索。
我正在尝试构建一个表达式树,该表达式树通过 Entity Framework 6(LINQ to Entities)通过 ODP.NET 托管驱动程序(当前版本)评估到适当的 Oracle 语句以执行过滤。这非常适用于 string <> nvarchar2 数据类型。包含搜索的输出类似于:
Select *
[...]
FROM "MYSCHEMA"."MYTABLE" "Extent1"
WHERE ("Extent1"."ANVARCHAR2COLUM" LIKE '%givenStrValueToFind%')
现在我想为 DateTime <> Timestamp(6) 获得相同的结果,因为这行 sql 语句对 oracle 查询有效并且 returns 所有包含 '08 的日期':
select * from "MYSCHEMA"."MYTABLE" where ATIMESTAMP6COLUMN like '%08%';
因为我是表达式树的新手,所以我首先需要知道(在谷歌搜索并尝试了这个那个之后),在我深入研究之前这是否可行。如果是这样,如何才能最好地实现这一点?由于没有为 DateTime 和 DateTime 定义 Contains Method?也许提供扩展方法?而且我不想直接对数据库执行查询。
任何提示对 'unhook' 给定的数据库数据类型可能都很好......
谢谢
不知道我有没有看懂。无论如何,您不需要构建表达式树来避免内存中的数据库加载。 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 的非规范函数。
如果你需要它,最好的办法是你再问一个问题。
对于 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 服务器 localdb 作为 DBMS)。
我想知道能不能得到线索。 我正在尝试构建一个表达式树,该表达式树通过 Entity Framework 6(LINQ to Entities)通过 ODP.NET 托管驱动程序(当前版本)评估到适当的 Oracle 语句以执行过滤。这非常适用于 string <> nvarchar2 数据类型。包含搜索的输出类似于:
Select *
[...]
FROM "MYSCHEMA"."MYTABLE" "Extent1"
WHERE ("Extent1"."ANVARCHAR2COLUM" LIKE '%givenStrValueToFind%')
现在我想为 DateTime <> Timestamp(6) 获得相同的结果,因为这行 sql 语句对 oracle 查询有效并且 returns 所有包含 '08 的日期':
select * from "MYSCHEMA"."MYTABLE" where ATIMESTAMP6COLUMN like '%08%';
因为我是表达式树的新手,所以我首先需要知道(在谷歌搜索并尝试了这个那个之后),在我深入研究之前这是否可行。如果是这样,如何才能最好地实现这一点?由于没有为 DateTime 和 DateTime 定义 Contains Method?也许提供扩展方法?而且我不想直接对数据库执行查询。
任何提示对 'unhook' 给定的数据库数据类型可能都很好...... 谢谢
不知道我有没有看懂。无论如何,您不需要构建表达式树来避免内存中的数据库加载。 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 的非规范函数。
如果你需要它,最好的办法是你再问一个问题。
对于 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 服务器 localdb 作为 DBMS)。