问题标签 [compiled-query]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
545 浏览

linq-to-sql - Linq To Sql:编译查询和扩展方法

我很感兴趣,Linq2Sql 如何处理返回 IQueryable 的编译查询。

如果我根据“GetEntitiesCompiled().Count()”或“GetEntitiesCompiled().Take(x)”之类的编译查询调用扩展方法。Linq2Sql 在后台做了什么?这会很糟糕,所以在这种情况下,我应该编写一个像“CountEntitiesCompiled”这样的编译查询。

他是否将结果(在本例中为“GetEntitiesCompiled()”)加载到内存中(映射到像“ToList()”这样的实体类)?

那么什么情况是有意义的,当编译的查询返回 IQueryable 时,该查询在向 Sql-Server 请求之前无法修改。所以在我看来,我可以同样出色地返回列表。

感谢您的回答!

0 投票
1 回答
1756 浏览

.net - Entity Framework 4 simple Compiled Query 编译时的内部异常

我想从排序表中检索一页。我希望在服务器上完成排序和分页。为此,我创建了以下编译查询:

这对我来说似乎是一个非常简单的查询。但是,当我使用以下语句执行它时:

我从源 System.Data.Entity 得到以下异常:

Count 必须是 DbConstantExpression 或 DbParameterReferenceExpression。参数名称:计数

使用此堆栈跟踪:

在 System.Data.Common.CommandTrees.ExpressionBuilder.Internal.ArgumentValidation.ValidateSkip(DbExpressionBinding 输入,IEnumerable'1 sortOrder,DbExpression 计数)在 System.Data.Common.CommandTrees.ExpressionBuilder.DbExpressionBuilder.Skip(DbExpressionBinding 输入,IEnumerable'1 sortOrder , DbExpression count) 在 System.Data.Objects.ELinq.ExpressionConverter.OrderByLifter.ApplySortOrderToSkip(DbExpression input, DbSortExpression sort, DbExpression k) at System.Data.Objects.ELinq.ExpressionConverter.OrderByLifter.SortLifter.Skip(DbExpression k) at System .Data.Objects.ELinq.ExpressionConverter.Skip(DbExpressionBinding input, DbExpression skipCount) at System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.SkipTranslator.TranslatePagingOperator(ExpressionConverter parent, DbExpression 操作数,DbExpression 计数)在 System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.UnarySequenceMethodTranslator.Translate(ExpressionConverter parent,MethodCallExpression 调用)在 System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.PagingTranslator.TranslateUnary(ExpressionConverter parent,DbExpression 操作数,MethodCallExpression 调用调用)在 System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.SequenceMethodTranslator.Translate(ExpressionConverter parent, MethodCallExpression call, SequenceMethod sequenceMethod) 在 System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.TypedTranslate(ExpressionConverter parent, MethodCallExpression linq) 在System.Data.Objects.ELinq.ExpressionConverter.TypedTranslator'1.Translate(ExpressionConverter parent,表达式 linq) 在 System.Data.Objects.ELinq.ExpressionConverter.TranslateExpression(Expression linq) 在 System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.UnarySequenceMethodTranslator.Translate(ExpressionConverter parent, MethodCallExpression call) 在 System.Data.Objects.ELinq .ExpressionConverter.MethodCallTranslator.SequenceMethodTranslator.Translate(ExpressionConverter parent, MethodCallExpression call, SequenceMethod sequenceMethod) 在 System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.TypedTranslate(ExpressionConverter parent, MethodCallExpression linq) 在 System.Data.Objects.ELinq.ExpressionConverter。 TypedTranslator'1.Translate(ExpressionConverter parent, Expression linq) at System.Data.Objects.ELinq.ExpressionConverter.TranslateExpression(Expression linq) 在 System.Data.Objects.ELinq.ExpressionConverter.Convert() 在 System.Data.Objects.ELinq.CompiledELinqQueryState.GetExecutionPlan(Nullable'1 forMergeOption) 在 System.Data.Objects.ObjectQuery'1.GetResults(Nullable'1 forMergeOption) 在系统。 Data.Objects.ObjectQuery'1.System.Collections.Generic.IEnumerable.GetEnumerator() 在 System.Collections.Generic.List'1..ctor(IEnumerable'1 集合) 在 System.Linq.Enumerable.ToList[TSource]( IEnumerable'1 source) 在 MyApp.Data.Repository.MessageRepository.GetByFolder(String folderId, Int32 pageSize, Int32 pageIndex, String sortField) 在 C:\Projects\MyApp\MyApp.Data\Repository\MessageRepository.cs:第 40 行在 MyApp C:\Projects\MyApp\MyApp 中的 .WebClient.Controllers.FolderController.Messages(GridCommand command, String folderId)。WebClient\Controllers\FolderController.cs:第 53 行,位于 System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase 控制器,Object[] 参数) 的 lambda_method(Closure , ControllerBase , Object[] ) 在 System.Web.Mvc.ReflectedActionDescriptor.Execute (ControllerContext controllerContext, IDictionary`2 参数) 在 System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary'2 参数) 在 System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClassd.b__a() 在 System. Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter 过滤器,ActionExecutingContext preContext,Func'1 延续)在 System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary'2 参数处执行(ControllerBase 控制器, Object[] 参数) 在 System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 参数) ) 在 System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClassd.b__a() 在 System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter 过滤器,ActionExecutingContext preContext,Func'1 延续)在 System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary'2 参数处执行(ControllerBase 控制器, Object[] 参数) 在 System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 参数) ) 在 System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClassd.b__a() 在 System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter 过滤器,ActionExecutingContext preContext,Func'1 延续)ActionDescriptor actionDescriptor,IDictionary'2 参数)在 System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClassd.b__a() 在 System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter 过滤器,ActionExecutingContext preContext,Func'1 延续)ActionDescriptor actionDescriptor,IDictionary'2 参数)在 System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClassd.b__a() 在 System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter 过滤器,ActionExecutingContext preContext,Func'1 延续)

第一次编译查询时似乎发生了异常。如果我从查询中删除 orderby,它就可以正常工作。但显然我希望在服务器上进行排序和分页,所以我不想在检索完整表后这样做。这是实体框架中的错误吗?我在网上找不到任何关于它的信息。有人知道如何解决这个问题吗?我将 .Net Framework 4 最终版本与 Visual Studio 2010 一起使用。

谢谢!

0 投票
1 回答
519 浏览

.net - 编译查询中的switch语句可能吗?

是否有可能在编译查询中使用类似 switch 语句的 linq to entity/sql?例如,当从数据库返回排序后的记录时,我想在一个编译查询中使用类似 switch 的语句来对不同的属性进行排序,而不是必须为您可能想要的每个属性编写 2 个编译查询(升序和降序) sort on,对于一个简单的可排序网格,最多可以编译 10 个查询。

在 T-SQL 中,使用 case 语句很容易,因为我想象大多数数据库都支持这样的构造,那么为什么 linq/entity 框架不支持它。

有什么解决办法吗?

0 投票
2 回答
2185 浏览

linq-to-sql - LINQ-to-SQL“成员访问在类型上不合法”异常与联合和编译查询

我有多个要联合在一起的查询,然后编译整个事情。未编译的查询运行良好,但“InvalidOperationException:'UserQuery+Foo' 的成员访问 'Int32 Id' 在类型 'System.Linq.IQueryable`1[UserQuery+Foo] 上不合法。” 编译和运行相同的查询时会引发异常。

我该如何解决?

编辑

看起来联合和分组无关紧要。从查询中删除这些元素在编译时仍然会导致异常:

将调用替换为GetA(dc)withdc.GetTable<Bar>()并添加 where 子句可解决问题。

那么,对于已编译的查询,像这样将单独的查询连接在一起是不可能的吗?

编辑#2

詹姆斯的回答一针见血。简化查询进一步揭示了根本问题:

此查询抛出NotSupportedException: Method 'System.Linq.IQueryable``1[UserQuery+Foo] GetA(System.Data.Linq.DataContext)' has no supported translation to SQL.

将对 GetA 的调用拉到单独的变量赋值中,然后在查询中使用该变量会引发InvalidOperationException: Sequence contains more than one element异常。

0 投票
2 回答
1189 浏览

.net - 关闭已编译查询的方法

正如我们所知,您不能将额外的子句添加.Where().First()已编译的查询中,因为这会更改查询并强制重新编译。我想知道的是哪些方法可用于“关闭”已编译的查询。

我知道大多数人都使用.AsEnumerable()or .ToList(),但是还有哪些其他方法也有效?我可以使用.AsQueryable(),还是这是一个无操作?

哪个性能更好?我知道.AsEnumerable().ToList(),但如果我想要一个IQueryable.AsEnumerable().AsQueryable().ToList()

0 投票
3 回答
3017 浏览

.net - 使用编译查询时我们还需要存储过程吗?

在实体框架(或 linq-to-sql)中结合 SQL Server 使用编译查询时,使用存储过程实际上是否还有性能优势?

编译后的查询将被缓存为参数化查询,因此性能应该接近于存储过程。是否存在存储过程会执行得更好的情况?

- 编辑 -

在回应 Yakimych 下面的回答时,我并不是要暗示编译查询与存储过程相同。如果您在应用程序端完成了所有可能的优化(在本例中为编译查询),我试图弄清楚是否仍然需要存储过程。所以我想我正在寻找为什么存储过程比应用程序端优化和参数化查询的组合更好的原因(这是有效的编译查询)。

我问这个的原因之一是因为有很多人似乎认为由于不同的原因(即这篇文章)不再需要存储过程。

0 投票
1 回答
158 浏览

.net - 如何重构已编译的 LINQ 查询?

是否可以重构已编译的 LINQ to SQL 查询?假设我有一个带有一些逻辑的查询,我想在它的基础上进行构建。是否可以重用该查询?

例如,假设我有一个基本查询来获取活动项目:

我想在上述表达式的基础上进行另一个查询。的文档CompiledQuery表明我不能在编译委托的结果上应用另一个运算符。那么重构这些表达式的推荐方法是什么?

我想我应该使用Expression,但应该如何使用呢?或者,还有更好的方法?

0 投票
2 回答
475 浏览

vb.net - LINQ 编译查询不会执行 - ArgumentNulException 未处理

我是第一次测试编译查询。

我目前的查询是:

但我收到一个 ArgumentNulException 未处理。

建议 LINQ 查询添加具有所需参数的对象,因此这是类:

为了完整起见,这是我收到的错误。

对于解决我的问题的任何帮助,我将不胜感激,因为我似乎真的找不到解决方案:(

0 投票
5 回答
15645 浏览

c# - 什么时候应该使用 CompiledQuery?

我有一张桌子:

我有一个类将具有以下方法:

在这种情况下我应该使用编译查询吗?

那么我的GetByName方法是:

它生成一个SELECT ID, Name FROM TagWhere在代码上执行。还是CompiledQuery在这种情况下我应该避免?

基本上我想知道什么时候应该使用编译查询。此外,在网站上,它们只为整个应用程序编译一次?

0 投票
5 回答
280 浏览

c# - 在应用程序的生命周期中,已编译的查询必须重新编译多少次?

在一个网站上,如果我有一堂课:

在我的页面中:

查询将被编译多少次?每次页面加载...?一旦进入应用程序......?