小编cya*_*902的帖子

实现IQueryable包装器来转换结果对象

更新2013-08-22:

看了"建立一个IQueryable提供者系列"(感谢链接!)后,我进一步了解了一下.我相应地更新了代码.它仍然没有完全工作.如果我正确理解了教程,GetEnumerator则在请求多个元素的情况下调用(例如,通过ToList()调用queryable或任何聚合函数).所以GetEnumerator包装器的所有实现都要Execute在提供者上调用一个并传递可查询的表达式.在另一种情况下,如果只请求一个元素,Execute则直接调用.queryable的表达式还反映了它是单个元素还是多个元素.它是否正确?

不幸的是,现在我在调用源查询提供程序时得到一个InvalidOperationException,说"Sequence包含多个元素"Execute.这是什么意思?我只是传递表达式而没有任何翻译,因为如上所述涉及相同的类型.IEnumerable代码中的翻译位可能不完整,但是现在我甚至没有达到这一点.


我正在尝试使用单个底层IQueryable作为数据源来实现一个简单的IQueryable包装器,该数据源为每个结果对象调用转换函数.

我认为这将是相对微不足道的,因为包装器唯一要做的就是翻译.但是我无法让我的实现工作.

请看下面我到目前为止所得到的内容.对于某些查询,它正在工作,但我在某些时候收到StackOverflowException InvalidOperationException.我想这是因为我的queryable和我的查询提供程序之间的循环关联.但我不明白如何正确实现这一点.

在这里我的问题和想法:

1.为什么IQueryable有一个Provider又可以再次返回IQueryable?这不是要求无休止的递归吗?

2.为什么不能实现IEnumerator?为什么FirstOrDefault不使用枚举器来获取元素?当我调试应用程序时GetEnumerator()没有被我的可查询器上的FirstOrDefault()调用.

3.由于在每种情况下都没有使用枚举器,因此调用翻译函数的正确位置在哪里?QueryProvider的Execute-methods似乎是正确的地方.但在某些情况下,我仍然需要在枚举器中进行翻译调用吗? 更新:我知道我意识到我需要提供自己的IEnumerable实现,TranslatingEnumerator并从我的Execute方法返回这个枚举.为了获得枚举器GetEnumerator调用Execute(见下文).请求枚举器的LINQ代码似乎确保表达式实际返回一个IEnumerable.

关于代码的一些附注:

  • 翻译源类型名为TDatabaseEntity,翻译目标类型名为TBusinessEntity.

  • 我基本上提供了一个IQueryable,它从基础IQueryable中获取结果对象,并将它们转换为TBusinessEntity 类型 对象.

  • 我知道表达式也需要翻译.但是我将它放在一边,因为在我的实际应用程序中,我使用相同类型的TBusinessEntity和TDatabaseEntity,因此Expression可以直接传递.

  • 尽管属性相同,但结果对象仍然需要转换为其他实例.更新:我的翻译层已经在我的应用程序中工作,并且还负责相关实体.它只是'实现一个IQueryable包装'的东西,我坚持.

  • 我担心整个实现都是错误的 - 代码中的TODO只是我自己的注释.

背景:我在我的数据访问层中实现了自己从DbContext接收的实体的分离,以防止我的业务层与实际实体联系 - 由于EF和其他要求的一些错误,我不能直接使用EF分离实体.

谢谢你的帮助!

IQueryable实现

internal class TranslatingQueryable<TDatabaseEntity, TBusinessEntity> : IQueryable<TBusinessEntity>
{
    private readonly IQueryProvider _provider;
    private readonly IQueryable<TDatabaseEntity> _source; …
Run Code Online (Sandbox Code Playgroud)

.net c# linq entity-framework iqueryable

16
推荐指数
1
解决办法
8631
查看次数

如何在使用Hibernate JPA的GlassFish 3上部署的Java EE Web应用程序中使用SLF4J?

是否可以在特定的GlassFish应用程序中使用SLF4J并仅为该应用程序配置SLF4J?我们目前正在努力解决GlassFish本身 安装了Hibernate的GlassFish在其lib目录中包含SLF4J API和记录器绑定这一事实.

我们的团队正在开发Java EE 6 Web应用程序.对于开发,应用程序部署在GlassFish 3.1.2上,尽管它应该尽可能便携.

我们决定使用SLF4J来记录应用程序消息.根据消息级别,应用程序必须以不同方式处理某些日志消息,因此必须能够自己配置日志记录后端 - 而不是在应用程序服务器中配置日志记录.

不幸的是,GlassFish 3.1.2 在其lib文件夹中包含slf4j-api-1.5.8.jarslf4j-jdk14-1.5.8.jar.这可以防止我们的应用程序使用slf4j-api-1.7.5.jarslf4j-simple-1.7.5.jar(后者将最终被另一个绑定替换).

有没有办法告诉GlassFish在考虑自己之前考虑应用程序li​​b(以便使用正确版本的API)以及确保使用提供SLF4J绑定的应用程序的任何方法?

我们正在使用Eclipse进行开发,但我们没有使用Maven.到目前为止,我发现的大多数调整/解决方法都是指Maven中我们无法使用的配置.如果您可以提供任何Eclipse特定提示,那将是很棒的.在Eclipse项目的属性中,我已经配置了构建路径的顺序,以便Web App Libraries位于顶部.但不知何故,这似乎还不够.

非常感谢您的帮助!

更新1:为了让它暂时运行,我刚刚从GlassFish lib目录中删除了SLF4J库.然后,应用程序使用其自己提供的SLF4J库.但我不认为这是部署过程的解决方案,我不确定这是否会破坏GlassFish使用的任何东西(为什么库仍然存在于那里?),这对我们的开发团队来说不是一个实用的解决方案.

更新2:实际上不是 GlassFish,它包括干扰的SLF4J库开箱即用,但我通过更新工具安装的Hibernate JPA包.我们目前不需要Hibernate JPA,但是在某些时候可能会出现更改为Hibernate的要求,我们还希望保持应用程序可以轻松移植到安装了Hibernate JPA或其他包含SLF4J的软件包的应用程序服务器.我相应地更新了问题标题.如何解决干扰应用服务器和应用程序依赖性的一般问题?

hibernate jpa glassfish slf4j java-ee

5
推荐指数
1
解决办法
1615
查看次数

标签 统计

.net ×1

c# ×1

entity-framework ×1

glassfish ×1

hibernate ×1

iqueryable ×1

java-ee ×1

jpa ×1

linq ×1

slf4j ×1