首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CompiledQuery抛出ArgumentException

CompiledQuery抛出ArgumentException
EN

Stack Overflow用户
提问于 2012-08-13 20:09:41
回答 1查看 726关注 0票数 5

我试图在扩展方法中使用一个非常简单的预编译查询来使用LINQ检索数据。SytelineRepository是我使用外部映射文件的自定义DataContext,我正在查询JobOrders表。我使用自定义DataContext已经很长时间了,没有问题,并且执行相同的查询没有问题;我只是想提高性能。然而,当我尝试使用CompiledQuery.Compile时,我得到了下面的ArgumentException。

下面是代码:

代码语言:javascript
复制
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);
    }

}

与此形成对比的是,这一工作是:

代码语言:javascript
复制
    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未被处理 'System.Linq.IQueryable`1Mpicorp.SytelineDataModel.JobOrder‘类型未定义Message=Property 'System.String ItemNumber’

代码语言:javascript
复制
   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()
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-08-13 21:07:51

usr的评论让我回顾了我发布的代码背后的定义,在这里我偶然发现了一个被长期遗忘的事实:我的表存储了几个不同的对象,并且我使用存储库的访问器对它们进行了区分,如下所示:

代码语言:javascript
复制
    public IQueryable<JobOrder> JobOrders
    {
        get { return GetTable<JobOrder>().Where(j => j.JobType == 'J'); }
    }

将方法更改为使用GetTable<>(),如下所示解决了这个问题。

代码语言:javascript
复制
    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
        );
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11941531

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档