微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c# – 与LINQ一起使用时,CreateDocumentQuery抛出异常,很好用SQL

我正在尝试检索存储在Azure DocumentDb中的单个实体.我发现我的代码仅在我通过sql提供查询时才有效,如下所示:

@H_502_4@var query = String.Format("SELECT * FROM UserDetail u WHERE u.id = '{0}'", id); return _client.CreateDocumentQuery<TEntity>(_selfLink, query).AsEnumerable().FirstOrDefault();

但是,使用LINQ表达式,如以下两个示例所示,它失败并出现异常:

@H_502_4@// EXCEPTION return _client.CreateDocumentQuery<TEntity>(_selfLink).Where(u => u.Id.ToString() == id).AsEnumerable().FirstOrDefault(); // EXCEPTION return (from u in _client.CreateDocumentQuery<TEntity>(_selfLink) where u.Id.ToString() == id select u).AsEnumerable().FirstOrDefault();

引发异常的相当可怕的堆栈跟踪是:

@H_502_4@System.AggregateException: One or more errors occurred. ---> Microsoft.Azure.Documents.Linq.DocumentQueryException: Unhandled expression type: 'Call' at Microsoft.Azure.Documents.Linq.ExpressionTosql.VisitScalarExpression(Expression inputExpression, TranslationContext context) at Microsoft.Azure.Documents.Linq.ExpressionTosql.VisitBinary(BinaryExpression inputExpression, TranslationContext context) at Microsoft.Azure.Documents.Linq.ExpressionTosql.VisitScalarExpression(Expression inputExpression, TranslationContext context) at Microsoft.Azure.Documents.Linq.ExpressionTosql.VisitScalarLambda(Expression inputExpression, TranslationContext context) at Microsoft.Azure.Documents.Linq.ExpressionTosql.VisitWhere(ReadOnlyCollection`1 arguments, TranslationContext context) at Microsoft.Azure.Documents.Linq.ExpressionTosql.VisitMethodCall(MethodCallExpression inputExpression, TranslationContext context) at Microsoft.Azure.Documents.Linq.ExpressionTosql.Translate(Expression inputExpression, TranslationContext context) at Microsoft.Azure.Documents.Linq.ExpressionTosql.TranslateQuery(Expression inputExpression) at Microsoft.Azure.Documents.Linq.sqlTranslator.TranslateQuery(Expression inputExpression) at Microsoft.Azure.Documents.Linq.DocumentQueryEvaluator.HandleMethodCallExpression(MethodCallExpression expression, QueryType defaultQueryType, QueryType& queryType) at Microsoft.Azure.Documents.Linq.DocumentQueryEvaluator.Evaluate(Expression expression, QueryType defaultQueryType, QueryType& queryType) at Microsoft.Azure.Documents.Linq.DocumentQueryExecutionContext.<ExecuteallAsync>d__7.MoveNext() --- End of stack trace from prevIoUs location where exception was thrown --- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult() at Microsoft.Azure.Documents.Linq.DocumentQuery`1.<GetEnumeratorTAsync>d__10.MoveNext() --- End of inner exception stack trace --- at System.Threading.Tasks.Task.ThrowIfExceptional(Boolean includeTaskCanceledExceptions) at System.Threading.Tasks.Task`1.GetResultCore(Boolean waitCompletionNotification) at System.Threading.Tasks.Task`1.get_Result() at Microsoft.Azure.Documents.Linq.DocumentQuery`1.GetEnumerator() at System.Linq.Enumerable.FirstOrDefault[TSource](IEnumerable`1 source) at Cherish.Domain.Repositories.Implementation.DocumentRepository`1.FindById(String id) in \\psf\home\Documents\Visual Studio 2013\Projects\Cherish\Cherish.Domain\Repositories\Implementation\DocumentRepository.cs:line 82 ---> (Inner Exception #0) Microsoft.Azure.Documents.Linq.DocumentQueryException: Unhandled expression type: 'Call' at Microsoft.Azure.Documents.Linq.ExpressionTosql.VisitScalarExpression(Expression inputExpression, TranslationContext context) at Microsoft.Azure.Documents.Linq.ExpressionTosql.VisitBinary(BinaryExpression inputExpression, TranslationContext context) at Microsoft.Azure.Documents.Linq.ExpressionTosql.VisitScalarExpression(Expression inputExpression, TranslationContext context) at Microsoft.Azure.Documents.Linq.ExpressionTosql.VisitScalarLambda(Expression inputExpression, TranslationContext context) at Microsoft.Azure.Documents.Linq.ExpressionTosql.VisitWhere(ReadOnlyCollection`1 arguments, TranslationContext context) at Microsoft.Azure.Documents.Linq.ExpressionTosql.VisitMethodCall(MethodCallExpression inputExpression, TranslationContext context) at Microsoft.Azure.Documents.Linq.ExpressionTosql.Translate(Expression inputExpression, TranslationContext context) at Microsoft.Azure.Documents.Linq.ExpressionTosql.TranslateQuery(Expression inputExpression) at Microsoft.Azure.Documents.Linq.sqlTranslator.TranslateQuery(Expression inputExpression) at Microsoft.Azure.Documents.Linq.DocumentQueryEvaluator.HandleMethodCallExpression(MethodCallExpression expression, QueryType defaultQueryType, QueryType& queryType) at Microsoft.Azure.Documents.Linq.DocumentQueryEvaluator.Evaluate(Expression expression, QueryType defaultQueryType, QueryType& queryType) at Microsoft.Azure.Documents.Linq.DocumentQueryExecutionContext.<ExecuteallAsync>d__7.MoveNext() --- End of stack trace from prevIoUs location where exception was thrown --- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult() at Microsoft.Azure.Documents.Linq.DocumentQuery`1.<GetEnumeratorTAsync>d__10.MoveNext()<---

作为参考,这是UserDetail类(删除了不相关的属性方法):

@H_502_4@public class UserDetail : IIdentifiableEntity { [JsonProperty(PropertyName = "id")] public Guid Id { get; set; } [JsonProperty(PropertyName = "fn")] public string Firstname { get; set; } [JsonProperty(PropertyName = "ln")] public string Lastname { get; set; } [JsonProperty(PropertyName = "contribs")] public IList<ContributorRelation> Contributors { get; set; } }

我知道我可以使用sql格式的方法,但是作为个人偏好,我想使用Lambdas,并且无法理解为什么我的代码不能正常工作.我是否需要从Guid做一些其他类型的coersion?

解决方法:

linq查询不支持对ToString方法调用.尝试将id解析为guid并执行如下所示的简单相等:

@H_502_4@return _client.CreateDocumentQuery<TEntity>(_selfLink).Where(u => u.Id == Guid.Parse(id)).AsEnumerable().FirstOrDefault();

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐