- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在尝试在扩展方法中使用一个非常简单的预编译查询来使用 LINQ to SQL 检索数据。 SytelineRepository 是我使用外部映射文件的自定义 DataContext,我正在查询 JobOrders 表。我已经使用自定义 DataContext 很长时间了,没有问题,执行相同的查询也没有问题;我只是想提高性能。但是,当我尝试使用 CompiledQuery.Compile 时,出现以下 ArgumentException。
代码如下:
public static class Queries
{
public static readonly Func<SytelineRepository, String, IQueryable<JobOrder>> GetOpenJobOrdersForItemQuery =
CompiledQuery.Compile(
(SytelineRepository r, String itemNumber) =>
from job in r.JobOrders
where job.ItemNumber == itemNumber
select job
);
public static IQueryable<JobOrder> GetOpenJobOrdersForItem(this SytelineRepository r, System.String itemNumber)
{
return GetOpenJobOrdersForItemQuery(r, itemNumber);
}
}
相比之下,这有效:
public static IEnumerable<JobOrder> GetOpenJobOrdersForItem(this SytelineRepository r, System.String itemNumber)
{
return GetOpenJobOrdersForItemUncompiledQuery(r, itemNumber);
}
public static IQueryable<JobOrder> GetOpenJobOrdersForItemUncompiledQuery(SytelineRepository r, String itemNumber)
{
return
from job in r.JobOrders
where job.ItemNumber == itemNumber
select job;
}
这是完整的错误:
System.ArgumentException was unhandled
Message=Property 'System.String ItemNumber' is not defined for type 'System.Linq.IQueryable`1[Mpicorp.SytelineDataModel.JobOrder]'
at System.Linq.Expressions.Expression.Property(Expression expression, PropertyInfo property)
at System.Data.Linq.SqlClient.SqlBinder.Visitor.AccessMember(SqlMember m, SqlExpression expo)
at System.Data.Linq.SqlClient.SqlVisitor.Visit(SqlNode node)
at System.Data.Linq.SqlClient.SqlBinder.Visitor.VisitExpression(SqlExpression expr)
at System.Data.Linq.SqlClient.SqlBinder.Visitor.VisitBinaryOperator(SqlBinary bo)
at System.Data.Linq.SqlClient.SqlVisitor.Visit(SqlNode node)
at System.Data.Linq.SqlClient.SqlBinder.Visitor.VisitExpression(SqlExpression expr)
at System.Data.Linq.SqlClient.SqlBinder.Visitor.VisitSelect(SqlSelect select)
at System.Data.Linq.SqlClient.SqlVisitor.Visit(SqlNode node)
at System.Data.Linq.SqlClient.SqlBinder.Visitor.VisitIncludeScope(SqlIncludeScope scope)
at System.Data.Linq.SqlClient.SqlVisitor.Visit(SqlNode node)
at System.Data.Linq.SqlClient.SqlBinder.Bind(SqlNode node)
at System.Data.Linq.SqlClient.SqlProvider.BuildQuery(ResultShape resultShape, Type resultType, SqlNode node, ReadOnlyCollection`1 parentParameters, SqlNodeAnnotations annotations)
at System.Data.Linq.SqlClient.SqlProvider.BuildQuery(Expression query, SqlNodeAnnotations annotations)
at System.Data.Linq.SqlClient.SqlProvider.System.Data.Linq.Provider.IProvider.Compile(Expression query)
at System.Data.Linq.CompiledQuery.ExecuteQuery(DataContext context, Object[] args)
at System.Data.Linq.CompiledQuery.Invoke[TArg0,TArg1,TResult](TArg0 arg0, TArg1 arg1)
at Mpicorp.SytelineDataModel.Queries.GetOpenJobOrdersForItem(SytelineRepository r, String itemNumber) in C:\SVN\Mpicorp.SytelineDataModel\trunk\SytelineDataModel\Queries.cs:line 21
at Mpicorp.SytelineDataModel.SytelineRepository.GetTimePhasedInventory(String itemNumber, Boolean includeForecast) in C:\SVN\Mpicorp.SytelineDataModel\trunk\SytelineDataModel\SytelineRepository.cs:line 242
at RepriceWorkbench.TimePhasedInventoryForm..ctor(SytelineRepository repository, String itemNumber) in C:\SVN\spirepriceutility\trunk\src\POWorkbench\TimePhasedInventoryForm.cs:line 32
at RepriceWorkbench.TimePhasedMenuForm.goBtn_Click(Object sender, EventArgs e) in C:\SVN\spirepriceutility\trunk\src\POWorkbench\TimePhasedMenuForm.cs:line 25
at System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
at System.Windows.Forms.Control.WndProc(Message& m)
at System.Windows.Forms.ButtonBase.WndProc(Message& m)
at System.Windows.Forms.Button.WndProc(Message& m)
at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData)
at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
at RepriceWorkbench.Program.Main() in C:\SVN\spirepriceutility\trunk\src\POWorkbench\Program.cs:line 66
at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.ThreadHelper.ThreadStart()
最佳答案
usr 的评论让我回顾了我发布的代码背后的定义,这就是我偶然发现一个长期被遗忘的事实的地方,我的表存储了几个不同的对象,我使用存储库的访问器来区分它们,就像这样:
public IQueryable<JobOrder> JobOrders
{
get { return GetTable<JobOrder>().Where(j => j.JobType == 'J'); }
}
将方法更改为使用 GetTable<>(),如下所示修复了问题。
public static readonly Func<SytelineRepository, String, IEnumerable<JobOrder>> GetOpenJobOrdersForItemQuery =
CompiledQuery.Compile(
(SytelineRepository r, String itemNumber) =>
from job in r.GetTable<JobOrder>()
where job.ItemNumber == itemNumber && job.JobType == 'J' && (job.Status == "F" || job.Status == "R")
select job
);
关于c# - CompiledQuery 抛出 ArgumentException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11941531/
我有一张 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 在她的电脑上运行它时,它通知她无
我是一名优秀的程序员,十分优秀!