使用 LINQ 表达式时的 Atlassian SDK InvalidCastException

Atlassian SDK InvalidCastException when using LINQ expressions

让我们首先声明我不是一个非常有经验的开发人员,所以我很可能在这里完全遗漏了一些东西。

我正在 VB .Net 解决方案中实施 Atlassian.NET SDK。大多数情况下一切正常,但当我尝试直接使用 LINQ 提供程序时出现以下错误:

An unhandled exception of type 'System.InvalidCastException' occurred in Atlassian.Jira.dll

Additional information: Unable to cast object of type 'System.Linq.Expressions.PropertyExpression' to type 'System.Linq.Expressions.ConstantExpression'.

完整异常:

System.InvalidCastException was unhandled HResult=-2147467262
Message=Unable to cast object of type 'System.Linq.Expressions.PropertyExpression' to type 'System.Linq.Expressions.ConstantExpression'. Source=Atlassian.Jira StackTrace: at Atlassian.Jira.Linq.JqlExpressionVisitor.GetFieldNameFromBinaryExpression(BinaryExpression expression) in c:\projects\atlassian-net-sdk\Atlassian.Jira\Linq\JqlExpressionVisitor.cs:line 65 at Atlassian.Jira.Linq.JqlExpressionVisitor.ProcessIndexedMemberEqualityOperator(BinaryExpression expression, Boolean equal) in c:\projects\atlassian-net-sdk\Atlassian.Jira\Linq\JqlExpressionVisitor.cs:line 142 at Atlassian.Jira.Linq.JqlExpressionVisitor.ProcessEqualityOperator(BinaryExpression expression, Boolean equal) in c:\projects\atlassian-net-sdk\Atlassian.Jira\Linq\JqlExpressionVisitor.cs:line 136 at Atlassian.Jira.Linq.JqlExpressionVisitor.VisitBinary(BinaryExpression node) in c:\projects\atlassian-net-sdk\Atlassian.Jira\Linq\JqlExpressionVisitor.cs:line 325 at System.Linq.Expressions.BinaryExpression.Accept(ExpressionVisitor visitor) at System.Linq.Expressions.ExpressionVisitor.Visit(Expression node) at System.Linq.Expressions.ExpressionVisitor.VisitLambda[T](Expression`1 node) at System.Linq.Expressions.Expression`1.Accept(ExpressionVisitor visitor) at System.Linq.Expressions.ExpressionVisitor.Visit(Expression node) at System.Linq.Expressions.ExpressionVisitor.VisitUnary(UnaryExpression node) at System.Linq.Expressions.UnaryExpression.Accept(ExpressionVisitor visitor) at System.Linq.Expressions.ExpressionVisitor.Visit(Expression node) at System.Linq.Expressions.ExpressionVisitor.VisitArguments(IArgumentProvider nodes) at System.Linq.Expressions.ExpressionVisitor.VisitMethodCall(MethodCallExpression node) at Atlassian.Jira.Linq.JqlExpressionVisitor.VisitMethodCall(MethodCallExpression node) in c:\projects\atlassian-net-sdk\Atlassian.Jira\Linq\JqlExpressionVisitor.cs:line 252 at System.Linq.Expressions.MethodCallExpression.Accept(ExpressionVisitor visitor) at System.Linq.Expressions.ExpressionVisitor.Visit(Expression node) at System.Linq.Expressions.ExpressionVisitor.VisitArguments(IArgumentProvider nodes) at System.Linq.Expressions.ExpressionVisitor.VisitMethodCall(MethodCallExpression node) at Atlassian.Jira.Linq.JqlExpressionVisitor.VisitMethodCall(MethodCallExpression node) in c:\projects\atlassian-net-sdk\Atlassian.Jira\Linq\JqlExpressionVisitor.cs:line 252 at System.Linq.Expressions.MethodCallExpression.Accept(ExpressionVisitor visitor) at System.Linq.Expressions.ExpressionVisitor.Visit(Expression node) at Atlassian.Jira.Linq.JqlExpressionVisitor.Process(Expression expression) in c:\projects\atlassian-net-sdk\Atlassian.Jira\Linq\JqlExpressionVisitor.cs:line 42 at Atlassian.Jira.Linq.JiraQueryProvider.Execute(Expression expression, Boolean isEnumerable) in c:\projects\atlassian-net-sdk\Atlassian.Jira\Linq\JiraQueryProvider.cs:line 44 at Atlassian.Jira.Linq.JiraQueryProvider.Execute(Expression expression) in c:\projects\atlassian-net-sdk\Atlassian.Jira\Linq\JiraQueryProvider.cs:line 39 at Atlassian.Jira.Linq.JiraQueryable`1.GetEnumerator() in c:\projects\atlassian-net-sdk\Atlassian.Jira\Linq\JiraQueryable.cs:line 29 at System.Linq.Buffer1..ctor(IEnumerable\1 source) at System.Linq.Enumerable.ToArray[TSource](IEnumerable`1 source) at JiraUpdater.JiraStuff.GetIssueByDetail(String summary) in C:\Users\v709092\Documents\Visual Studio 2013\Projects\JiraUpdater\JiraUpdater\JiraStuff.vb:line 33 at JiraUpdater.Form1.ButtonMassUpdate_Click(Object sender, EventArgs e) in C:\Users\v709092\Documents\Visual Studio 2013\Projects\JiraUpdater\JiraUpdater\Form1.vb:line 98 at System.Windows.Forms.Control.OnClick(EventArgs e) at System.Windows.Forms.Button.OnClick(EventArgs e) 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.Control.ControlNativeWindow.OnMessage(Message& m) at System.Windows.Forms.Control.ControlNativeWindow.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 Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.OnRun() at Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.DoApplicationModel() at Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.Run(String[] commandLine) at JiraUpdater.My.MyApplication.Main(String[] Args) in :line 81 at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args) at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args) at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() at System.Threading.ThreadHelper.ThreadStart_Context(Object state) 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) at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) at System.Threading.ThreadHelper.ThreadStart() InnerException:

我的代码是在项目 WIKI 页面上找到的示例代码的直接转换。

    Dim myJira As Jira = Jira.CreateRestClient("JiraServer", "username", "password")

    Dim myIssueQuery = From i In myJira.Issues
                                Where i.Project = "JiraProjectName"
                                Select i

   Console.WriteLine( myIssueQuery.Count())

经过一些研究后,我确信这是 LINQ 提供程序处理查询的方式的问题。这个issue早就反馈给开发者,标记为"Won't Fix",因为开发者不熟悉VB。

我非常感谢任何帮助,无论是向开发人员提供相关详细信息以解决他们方面的问题,还是更实际地帮助指出我做错了什么。

Jira 的 Api 可能会变得有点复杂,很容易最终使用无法满足您要求的旧版本。我使用 nuget 包 "Atlassian.SDK".

获得了最好的结果

有了这个,做你想做的事就相对简单了。这是 C# 代码,但我想 vb.net 不会有太大不同。

 this.JiraConnection = Jira.CreateRestClient(jiraUrl, jiraUser, jiraPassword);
 string jql = "project = TC";
 IEnumerable<Issue> issues = this.JiraConnection.GetIssuesFromJql(jql, 100);

这允许您使用 Jira 查询语言来获取您想要的问题,在我的测试中证明这比使用 Linq 查询更快更可靠。

HTH