我遇到使用Linq创建正确表达式的问题,我希望你能帮助我......
我有以下关系:
Question (1) --- (n) QuestionsKeywords (n) --- (1) Keyword
PK Id PK Id PK Id
string DisplayAs int QuestionId string DisplayAs
int KeywordId
因此,一个问题可以分配许多关键字,关键字可以分配给许多问题。
数据模型有一个QuestionKeywords集合的问题。
用户在CheckedListBox控件中选择他/她想要用来过滤数据网格中的问题列表的关键字。我创建了一个List keywordIds,其中包含每个选定关键字的记录ID。此列表将用于稍后过滤问题列表...
最后......问题......
如何实现一个Expression,它将返回所有在keywordIds中包含KeywordId的QuestionKeyword实体的所有问题?
我已尝试过以下操作,但后面会遇到运行时异常。
Expression<Func<QuestionEntity, bool>> expression =
q => q.QuestionsKeywords.Any(qk => keywordIds.Any(k => k.Id == qk.Keyword.Id));
感谢您的时间和建议!
麦克
System.InvalidCastException未处理
的HResult = -2147467262
Message =无法转换类型&System; System.Linq.Expressions.ConstantExpression&#39;输入&#39; SD.LLBLGen.Pro.LinqSupportClasses.ExpressionClasses.SetExpression&#39;。
来源= SD.LLBLGen.Pro.ORMSupportClasses
堆栈跟踪:
at c:\ Myprojects \ VS.NET Projects \ LLBLGen Pro v4.1 \ Frameworks \ LLBLGen Pro \ RuntimeLibraries \ ORMSupportClasses \ Linq \ ExpressionHandlers \ MemberAccessEvaluator中的SD.LLBLGen.Pro.LinqSupportClasses.ExpressionHandlers.MemberAccessEvaluator.HandleLinqExpressionAsSetExpression(LinqExpressionAsSetExpression expressionToHandle)。 cs:183行
位于c:\ Myprojects \ VS.NET Projects \ LLBLGen Pro v4.1 \ Frameworks \ LLBLGen Pro \ RuntimeLibraries \ ORMSupportClasses \ Linq \ ExpressionHandlers \ GenericExpressionHandler中的SD.LLBLGen.Pro.LinqSupportClasses.ExpressionHandlers.GenericExpressionHandler.HandleExpression(Expression expressionToHandle)。 cs:第192行
位于c:\ Myprojects \ VS.NET Projects \ LLBLGen Pro v4.1 \ Frameworks \ LLBLGen Pro \ RuntimeLibraries \ ORMSupportClasses \ Linq \ ExpressionHandlers \ GenericExpressionHandler中的SD.LLBLGen.Pro.LinqSupportClasses.ExpressionHandlers.GenericExpressionHandler.HandleAllAnyExpression(AllAnyExpression expressionToHandle)。 cs:564行
位于c:\ Myprojects \ VS.NET Projects \ LLBLGen Pro v4.1 \ Frameworks \ LLBLGen Pro \ RuntimeLibraries \ ORMSupportClasses \ Linq \ ExpressionHandlers \ GenericExpressionHandler中的SD.LLBLGen.Pro.LinqSupportClasses.ExpressionHandlers.GenericExpressionHandler.HandleExpression(Expression expressionToHandle)。 cs:第140行
at c:\ Myprojects \ VS.NET Projects \ LLBLGen Pro v4.1 \ Frameworks \ LLBLGen Pro \ RuntimeLibraries \ ORMSupportClasses \ Linq \ ExpressionHandlers \ GenericExpressionHandler中的SD.LLBLGen.Pro.LinqSupportClasses.ExpressionHandlers.GenericExpressionHandler.HandleLambdaExpression(LambdaExpression expressionToHandle)。 cs:1377行
位于c:\ Myprojects \ VS.NET Projects \ LLBLGen Pro v4.1 \ Frameworks \ LLBLGen Pro \ RuntimeLibraries \ ORMSupportClasses \ Linq \ ExpressionHandlers \ GenericExpressionHandler中的SD.LLBLGen.Pro.LinqSupportClasses.ExpressionHandlers.GenericExpressionHandler.HandleExpression(Expression expressionToHandle)。 cs:296行
位于c:\ Myprojects \ VS.NET Projects \ LLBLGen Pro v4.1 \ Frameworks \ LLBLGen Pro \ RuntimeLibraries \ ORMSupportClasses \ Linq \ ExpressionHandlers \ GenericExpressionHandler中的SD.LLBLGen.Pro.LinqSupportClasses.ExpressionHandlers.GenericExpressionHandler.HandleAllAnyExpression(AllAnyExpression expressionToHandle)。 cs:565行
位于c:\ Myprojects \ VS.NET Projects \ LLBLGen Pro v4.1 \ Frameworks \ LLBLGen Pro \ RuntimeLibraries \ ORMSupportClasses \ Linq \ ExpressionHandlers \ GenericExpressionHandler中的SD.LLBLGen.Pro.LinqSupportClasses.ExpressionHandlers.GenericExpressionHandler.HandleExpression(Expression expressionToHandle)。 cs:第140行
at c:\ Myprojects \ VS.NET Projects \ LLBLGen Pro v4.1 \ Frameworks \ LLBLGen Pro \ RuntimeLibraries \ ORMSupportClasses \ Linq \ ExpressionHandlers \ GenericExpressionHandler中的SD.LLBLGen.Pro.LinqSupportClasses.ExpressionHandlers.GenericExpressionHandler.HandleLambdaExpression(LambdaExpression expressionToHandle)。 cs:1377行
位于c:\ Myprojects \ VS.NET Projects \ LLBLGen Pro v4.1 \ Frameworks \ LLBLGen Pro \ RuntimeLibraries \ ORMSupportClasses \ Linq \ ExpressionHandlers \ GenericExpressionHandler中的SD.LLBLGen.Pro.LinqSupportClasses.ExpressionHandlers.GenericExpressionHandler.HandleExpression(Expression expressionToHandle)。 cs:296行
at c:\ Myprojects \ VS.NET Projects \ LLBLGen Pro v4.1 \ Frameworks \ LLBLGen Pro \ RuntimeLibraries \ ORMSupportClasses \ Linq \ ExpressionHandlers \ GenericExpressionHandler中的SD.LLBLGen.Pro.LinqSupportClasses.ExpressionHandlers.GenericExpressionHandler.HandleWhereExpression(WhereExpression expressionToHandle)。 cs:974行
位于c:\ Myprojects \ VS.NET Projects \ LLBLGen Pro v4.1 \ Frameworks \ LLBLGen Pro \ RuntimeLibraries \ ORMSupportClasses \ Linq \ ExpressionHandlers \ GenericExpressionHandler中的SD.LLBLGen.Pro.LinqSupportClasses.ExpressionHandlers.GenericExpressionHandler.HandleExpression(Expression expressionToHandle)。 cs:216行
在c:\ Myprojects \ VS.NET Projects \ LLBLGen Pro v4.1 \ Frameworks \ LLBLGen Pro \ RuntimeLibraries \ ORMSupportClasses \ Linq \ ExpressionHandlers中的SD.LLBLGen.Pro.LinqSupportClasses.ExpressionHandlers.GenericExpressionHandler.HandleSelectExpression(SelectExpression expressionToHandle,SelectExpression newInstance) \ GenericExpressionHandler.cs:第817行
在c:\ Myprojects \ VS.NET Projects \ LLBLGen Pro v4.1 \ Frameworks \ LLBLGen Pro \ RuntimeLibraries \ ORMSupportClasses \ Linq \ ExpressionHandlers \ GenericExpressionHandler中的SD.LLBLGen.Pro.LinqSupportClasses.ExpressionHandlers.GenericExpressionHandler.HandleSelectExpression(SelectExpression expressionToHandle)。 cs:796行
位于c:\ Myprojects \ VS.NET Projects \ LLBLGen Pro v4.1 \ Frameworks \ LLBLGen Pro \ RuntimeLibraries \ ORMSupportClasses \ Linq \ ExpressionHandlers \ GenericExpressionHandler中的SD.LLBLGen.Pro.LinqSupportClasses.ExpressionHandlers.GenericExpressionHandler.HandleExpression(Expression expressionToHandle)。 cs:207行
在c:\ Myprojects \ VS.NET Projects \ LLBLGen Pro v4.1 \ Frameworks \ LLBLGen Pro \ RuntimeLibraries \ ORMSupportClasses \ Linq \ ExpressionHandlers中的SD.LLBLGen.Pro.LinqSupportClasses.ExpressionHandlers.GenericExpressionHandler.HandleSelectExpression(SelectExpression expressionToHandle,SelectExpression newInstance) \ GenericExpressionHandler.cs:第817行
在c:\ Myprojects \ VS.NET Projects \ LLBLGen Pro v4.1 \ Frameworks \ LLBLGen Pro \ RuntimeLibraries \ ORMSupportClasses \ Linq \ ExpressionHandlers \ GenericExpressionHandler中的SD.LLBLGen.Pro.LinqSupportClasses.ExpressionHandlers.GenericExpressionHandler.HandleSelectExpression(SelectExpression expressionToHandle)。 cs:796行
位于c:\ Myprojects \ VS.NET Projects \ LLBLGen Pro v4.1 \ Frameworks \ LLBLGen Pro \ RuntimeLibraries \ ORMSupportClasses \ Linq \ ExpressionHandlers \ GenericExpressionHandler中的SD.LLBLGen.Pro.LinqSupportClasses.ExpressionHandlers.GenericExpressionHandler.HandleExpression(Expression expressionToHandle)。 cs:207行
位于c:\ Myprojects \ VS.NET Projects \ LLBLGen Pro v4.1 \ Frameworks \ LLBLGen Pro \ RuntimeLibraries \ ORMSupportClasses \ Linq \ ExpressionHandlers \ GenericExpressionHandler中的SD.LLBLGen.Pro.LinqSupportClasses.ExpressionHandlers.GenericExpressionHandler.HandleSortClauseExpression(SortClauseExpression expressionToHandle)。 cs:640行
位于c:\ Myprojects \ VS.NET Projects \ LLBLGen Pro v4.1 \ Frameworks \ LLBLGen Pro \ RuntimeLibraries \ ORMSupportClasses \ Linq \ ExpressionHandlers \ GenericExpressionHandler中的SD.LLBLGen.Pro.LinqSupportClasses.ExpressionHandlers.GenericExpressionHandler.HandleExpression(Expression expressionToHandle)。 cs:213行
位于c:\ Myprojects \ VS.NET Projects \ LLBLGen Pro v4.1 \ Frameworks \ LLBLGen Pro \ RuntimeLibraries \ ORMSupportClasses \ Linq \ LLBLGenProProviderBase.cs中的SD.LLBLGen.Pro.LinqSupportClasses.LLBLGenProProviderBase.HandleExpressionTree(表达式表达式):第189行
at SD.LLBLGen.Pro.LinqSupportClasses.LLBLGenProProviderBase.Execute(表达式表达式)在c:\ Myprojects \ VS.NET Projects \ LLBLGen Pro v4.1 \ Frameworks \ LLBLGen Pro \ RuntimeLibraries \ ORMSupportClasses \ Linq \ LLBLGenProProviderBase.cs:第129行
at c:\ Myprojects \ VS.NET Projects \ LLBLGen Pro v4.1 \ Frameworks \ LLBLGen Pro \ RuntimeLibraries \ ORMSupportClasses \ Linq \中的SD.LLBLGen.Pro.LinqSupportClasses.LLBLGenProProviderBase.System.Linq.IQueryProvider.Execute(表达式) LLBLGenProProviderBase.cs:第679行
at SD.LLBLGen.Pro.LinqSupportClasses.LLBLGenProQuery 1.Execute() in c:\Myprojects\VS.NET Projects\LLBLGen Pro v4.1\Frameworks\LLBLGen Pro\RuntimeLibraries\ORMSupportClasses\Linq\LLBLGenProQuery.cs:line 86
at SD.LLBLGen.Pro.LinqSupportClasses.LLBLGenProQuery
1.SD.LLBLGen.Pro.LinqSupportClasses.ILLBLGenProQuery.ExecuteTResult in c:\ Myprojects \ VS.NET Projects \ LLBLGen Pro v4.1 \ Frameworks \ LLBLGen Pro \ RuntimeLibraries \ ORMSupportClasses \ Linq \ LLBLGenProQuery.cs:第130行
在c:\ Myprojects \ VS.NET Projects \ LLBLGen Pro v4.1 \ Frameworks \ LLBLGen Pro \ RuntimeLibraries \ ORMSupportClasses \ Linq \ ExtensionMethods.cs中的SD.LLBLGen.Pro.LinqSupportClasses.QueryableExtensionMethods.Execute [TResult](IQueryable source) :第146行
at ContentLibrary.MainForm.FilterButton_Click(Object sender,EventArgs e)位于c:\ PROJECTS \ ContentLibrary \ ContentLibrary \ MainForm.cs:第1282行
在System.Windows.Forms.Control.OnClick(EventArgs e)
在System.Windows.Forms.Button.OnClick(EventArgs e)
在System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
在System.Windows.Forms.Control.WmMouseUp(消息&amp; m,MouseButtons按钮,Int32点击)
在System.Windows.Forms.Control.WndProc(消息&amp; m)
在System.Windows.Forms.ButtonBase.WndProc(消息&amp; m)
在System.Windows.Forms.Button.WndProc(消息&amp; m)
在System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message&amp; m)
在System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message&amp; m)
在System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd,Int32 msg,IntPtr wparam,IntPtr lparam)
在System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG&amp; msg)
在System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID,Int32 reason,Int32 pvLoopData)
在System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason,ApplicationContext context)
在System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason,ApplicationContext context)
在System.Windows.Forms.Application.Run(Form mainForm)
在C:\ PROJECTS \ ContentLibrary \ ContentLibrary \ Program.cs中的ContentLibrary.Program.Main():第19行
在System.AppDomain._nExecuteAssembly(RuntimeAssembly程序集,String [] args)
在System.AppDomain.ExecuteAssembly(String assemblyFile,Evidence assemblySecurity,String [] args)
在Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
在System.Threading.ThreadHelper.ThreadStart_Context(对象状态)
at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext,ContextCallback callback,Object state,Boolean preserveSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext,ContextCallback callback,Object state,Boolean preserveSyncCtx)
在System.Threading.ExecutionContext.Run(ExecutionContext executionContext,ContextCallback回调,对象状态)
在System.Threading.ThreadHelper.ThreadStart()
InnerException:
答案 0 :(得分:3)
这是因为keywordIds是一个存在于内存中的集合,而其他集合存在于您的数据库中。尝试将id的集合作为整数数组传递给闭包。
var keywordIdsArray = keywordIds.Select(x => x.Id).ToArray();
Expression<Func<QuestionEntity, bool>> expression =
q => q.QuestionsKeywords.Any(qk => keywordIdsArray.Contains(qk.Keyword.Id));