gpt4 book ai didi

c# - IQueryable 可以用文字表达

转载 作者:太空宇宙 更新时间:2023-11-03 11:36:30 25 4
gpt4 key购买 nike

所以我有以下场景,但我不确定如何处理它。

在我们正在构建的应用程序中,我们有一个 ReferenceDataService,用于通过 RIA 服务加载数据。查询在客户端作为 IQuerable 构建,并提交给服务器进行检索。现在提交的大多数引用查询都是相同的并且被多次调用,因此我想改为从实体缓存中为这些查询提供服务。

下面是生成的查询表达式的示例,我突出显示了查询更改的区域。在某些情况下,查询具有附加条件,但大多数情况下可能没有。

Chime.DataModel.classification[]
.Where(c => ((value(Chime.Modules.Reference.Client.Agent.ReferenceDataLoader+<>c__DisplayClass20).includeSchema
*AndAlso c.class_code.StartsWith(value(Chime.Modules.Reference.Client.Agent.ReferenceDataLoader+<>c__DisplayClass20).schema))*
OrElse (Not(value(Chime.Modules.Reference.Client.Agent.ReferenceDataLoader+<>c__DisplayClass20).includeSchema)
AndAlso *c.parent_code.StartsWith(value(Chime.Modules.Reference.Client.Agent.ReferenceDataLoader<>c__DisplayClass20).schema))))*
.OrderByDescending(c => c.value_scheme_ind)
.ThenBy(c => c.sequence_number)
.ThenBy(c => c.class_label)

所以我想做的是缓存查询,如果另一个查询具有相同的条件,我可以访问缓存。我遇到的问题是查询中使用的文字似乎不可用,因此我无法确定一个查询是否不同于另一个查询。例如,模式代码无处可寻。它必须在某个时候发送到服务器,但我不确定如何获取它。

有没有人知道这样做的方法或以前遇到过这个?

戴夫

最佳答案

如果您使用的是 WCF 数据服务,我只想说在您的 IQueryable 上调用 ToString() ,它会返回要针对数据服务执行的查询的确切 URI...您可以简单地基于它进行缓存字符串值。

据我所知,RIA 不会公开此类 Hook ,因此您将不得不依赖更传统的方法。

实现一个 ExpressionVisitor 来访问您的 IQueryable.Expression 并为其计算哈希码。

您提到在表达式树中看不到常量字符串值。那是因为它们还没有内联到表达式树中,因此仍然作为 MemberAccessExpressions 而不是 ConstantExpressions 存在。要解决此问题,您可以使用部分评估的 ExpressionVisitor。此处给出了此类的来源

http://msdn.microsoft.com/en-us/library/bb546158.aspx

查看 Evaluator 类。

关于c# - IQueryable 可以用文字表达,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6104649/

25 4 0