- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我一直在使用 LINQ-SQL,试图获得可以热插入其他查询的可重用表达式 block 。所以,我从这样的事情开始:
Func<TaskFile, double> TimeSpent = (t =>
t.TimeEntries.Sum(te => (te.DateEnded - te.DateStarted).TotalHours));
TaskFiles.Select(t => new {
t.TaskId,
TimeSpent = TimeSpent(t),
})
CompiledQuery.Compile
方法。虽然这需要
DataContext
作为参数,我想我会忽略它,并尝试相同的
Func
.所以我最终得到了以下结果:
static Func<UserQuery, TaskFile, double> TimeSpent =
CompiledQuery.Compile<UserQuery, TaskFile, double>(
(UserQuery db, TaskFile t) =>
t.TimeEntries.Sum(te => (te.DateEnded - te.DateStarted).TotalHours));
db
范围。但是,现在当我们使用这个更新的参数时,只有
1 生成 SQL 查询。表达式已成功转换为 SQL 并包含在原始查询中。
CompiledQuery.Compile
很特别?似乎
DataContext
根本不需要参数,此时我认为它是生成完整查询的更方便的参数。
CompiledQuery.Compile
会被认为是个好主意吗?像这样的方法?这似乎是一个大技巧,但它似乎是 LINQ 重用的唯一可行途径。
Func
在
Where
内声明,我们看到以下异常:
NotSupportedException: Method 'System.Object DynamicInvoke(System.Object[])' has no supported translation to SQL.
.Where(t => TimeSpent(t) > 2)
Func
由
CompiledQuery.Compile
生成,查询成功执行,生成正确的SQL。
Where
的理想方式语句,但它显示了如何生成表达式树。
最佳答案
执行摘要:Expression.Compile
生成 CLR 方法,其中 CompiledQuery.Compile
生成一个作为 SQL 占位符的委托(delegate)。
直到现在您还没有得到正确答案的原因之一是您的示例代码中的某些内容不正确。如果没有数据库或通用样本,其他人可以玩的机会会进一步减少(我知道很难提供,但通常是值得的)。
谈事实:
Expression<Func<TaskFile, double>> TimeSpent = (t =>
t.TimeEntries.Sum(te => (te.DateEnded - te.DateStarted).TotalHours));Then, we can use the above in a LINQ query like the below:
TaskFiles.Select(t => new {
t.TaskId,
TimeSpent = TimeSpent(t),
})
Func<>
类型。这会产生与以下段落中概述的场景相同的情况。请务必阅读并理解它)。
TimeSpent
是一个表达式)。他们需要首先被编译成一个委托(delegate)。当您调用
Expression.Compile()
时会发生什么是表达式树被编译成 IL,它被注入(inject)到
DynamicMethod
中。 ,然后你会得到一个代表。
var q = TaskFiles.Select(t => new {
t.TaskId,
TimeSpent = TimeSpent.Compile().DynamicInvoke()
});
This produces the expected output, except, a query per row is generated for the plugged expression. This is visible within LINQPad. Not good.
TaskFiles
, 脱水
TaskFile
实例,然后在内存中针对它运行您的选择器。您可能会收到每个 TaskFile 的查询,因为它们包含一个或多个 1:m 映射。
CompiledQuery.Compile()
做一些不同的事情。它将查询编译为 SQL,它返回的委托(delegate)只是 Linq to SQL 将在内部使用的占位符。您不能在 CLR 中“调用”此方法,它只能用作另一个表达式树中的节点。
CompiledQuery.Compile
生成有效的查询? 'd 表达呢?因为它知道这个表达式节点做什么,因为它知道它背后的 SQL。在
Expression.Compile
案例,它只是一个
InvokeExpression
调用
DynamicMethod
正如我之前解释的那样。
关于linq-to-sql - LINQ-SQL 重用 - CompiledQuery.Compile,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6479552/
我有一张 table : -- Tag ID | Name ----------- 1 | c# 2 | linq 3 | entity-framework 我有一个包含以下方法的类:
我有多个带有“id”组件的表。我想使用 LINQ 从这些表之一获取具有正确 LINQ-To-SQL 类型的项目,但只使用一个 CompiledQuery。 这是一个当前有效的示例。假设在 DBML 中
我有一个查询执行得不太好,例如生成的 SQL 代码是次优的。 原始语句看起来像这样(简化): ctx.Table1.Where(t => ...) .OrderBy(t => ..
我正在尝试加快常用查询的速度。使用 CompiledQuery 似乎是答案。但是当我尝试编译版本时,编译版本和非编译版本之间的性能没有差异。 有人能告诉我为什么使用 Queries.FindTrade
我正在尝试在扩展方法中使用一个非常简单的预编译查询来使用 LINQ to SQL 检索数据。 SytelineRepository 是我使用外部映射文件的自定义 DataContext,我正在查询 J
我有一个与 this previous question of mine 相关的问题.在涉及多个连接的现有 LINQ 位中,我尝试采用包含连接的每个单独方法并将其转换为 CompiledQuery。
在我的自定义 ObjectContext 类中,我将我的实体集合公开为 IObjectSet,以便对它们进行单元测试。当我在已编译的查询中使用此 ObjectContext 并调用“Include”扩
所以我对访问 SQLServer 数据库的不同方法进行了一些分析。我做了普通的 TSQL、一个 CompiledQuery 和一个非编译的 Linq 语句。 正如预期的那样,性能按照相同的顺序进行,但
我正在为 Windows Phone (SDK 7.1) 应用程序编写 Silverlight,我正在 LongListSelector 中显示来自 CompactSQL 数据库的数据。从 Silve
全部, 因此,我已将 LINQ-to-SQL 中的所有选择查询转换为使用 CompiledQueries 来加快速度。到目前为止,对于 select 语句来说效果很好,但我一直无法弄清楚如何预编译插入
我一直在使用 LINQ-SQL,试图获得可以热插入其他查询的可重用表达式 block 。所以,我从这样的事情开始: Func TimeSpent = (t => t.TimeEntries.Sum(t
我正在尝试使用 Linq-to-Entities 编写 CompiledQuery,它将替换采用两个数组(在本例中为逗号分隔的 TEXT)参数的存储过程。本质上,SQL 是这样的: *Stored P
我在使用 CompiledQuery.Compile 时遇到了一个奇怪的问题。尝试在查询中使用静态只读字段时,我收到以下错误消息: Class member X is unmapped 如果我将字段
我有以下代码,我想知道是否需要锁: private static Func _GetAccountAttributeGroup; public static AccountAttributeGroup
我使用 Visual Studio 2010 创建了一个简单的 XSLT 文件,它在我的机器上运行良好。但是,当我的同事尝试使用 Visual Studio 2013 在她的电脑上运行它时,它通知她无
我是一名优秀的程序员,十分优秀!