- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我正在尝试查询具有某种类型产品的 Art。这是我的艺术模型:
public string Title { get; set; }
public string Description { get; set; }
public List<Product> Products { get; set; }
public string PaintedLocation { get; set; }
从这里开始,我所做的就是执行以下 LINQ 查询:
List<Art> items = DocumentDbHelper.Client.CreateDocumentQuery<Art>(collection.DocumentsLink)
.Where(i => i.type == "art")
.Where(i => i.Products.Any(p => p.Name == productType))
.AsEnumerable()
.ToList();
我收到以下错误:
"Method 'Any' is not supported."
我转到代码引用的页面查看 what is supported但我没有看到它说不支持 Any(),所以我可能做错了。如有任何帮助,我们将不胜感激。
更新
这对我来说真的很奇怪,所以我将其分解以查看两个结果返回的内容,以便更好地调试问题:
List<Art> items = DocumentDbHelper.Client.CreateDocumentQuery<Art>(collection.DocumentsLink)
.Where(i => i.Id.Contains("art"))
.AsEnumerable()
.ToList();
items = items.Where(i => i.Products.Any(p => p.Name == productType))
.AsEnumerable()
.ToList();
出于某种原因,这有效,我不喜欢它,因为自从我将其转换为列表以来,它运行了查询两次 - 但这至少证明 Any() 和 Select() 在技术上应该有效.
最佳答案
针对 IQueryable<T>
的 LINQ 查询最大的困惑之一是它们看起来与针对 IEnumerable<T>
的查询完全相同。嗯,前者正在使用 Expression<Func<..>>
每当后者使用Func<..>
时,但除非使用显式声明,否则这不是那么明显并且似乎不重要。然而,巨大的差异出现在运行时。
一旦IEnumerable<T>
查询已成功编译,在运行时它就可以工作,而 IQueryable<T>
则不是这种情况。一个IQueryable<T>
查询实际上是一个表达式树,由查询提供程序在运行时处理。
从一方面来说这是一个很大的好处,从另一方面来说,由于查询提供程序在查询编译时不涉及(所有方法都由 Queryable
类作为扩展方法提供),因此无法知道提供者是否支持某些构造/方法,或者直到运行时才支持。使用 Linq to Entities 的人非常清楚这一点。让事情变得更困难的是,没有明确的文档说明特定查询提供程序支持什么,更重要的是,它不支持什么(正如您从提供的“支持什么”链接中注意到的)。
解决办法是什么? (以及为什么你的第二个代码有效)
技巧是根据 IQueryable<T>
编写最大可能的(即查询提供程序支持的)查询部分。 ,然后切换到IEnumerable<T>
并完成其余的操作(记住,一旦编译, IEnumerable<T>
查询就可以工作)。切换由 AsEnumerable()
执行称呼。这就是为什么你的第二个代码可以工作 - 因为不受支持 Any
DocumentDb 查询提供程序上下文中不再包含该方法。请注意ToList
不需要调用,并且查询不会执行两次 - 事实上,这样就没有单个查询,而是两个查询 - 一个在数据库中,一个在内存中。
所以像这样就足够了:
List<Art> items = DocumentDbHelper.Client.CreateDocumentQuery<Art>(collection.DocumentsLink)
.Where(i => i.type == "art")
.AsEnumerable() // The context switch!
.Where(i => i.Products.Any(p => p.Name == productType))
.ToList();
最后,DocumentDb 查询提供程序真正支持什么
文档中还不太清楚,但答案是:确切(且唯一)其中包含的内容。换句话说,唯一支持的查询运算符(或者更好地说 Queryable
或 Enumerable
扩展方法)是
正如您所见,它非常有限。忘记连接和分组运算符,Any
, Contains
, Count
, First
, Last
等等。唯一的好处是它很容易记住:)
我怎么知道呢?好吧,像往常一样,当文档中有些内容不清楚时,可以使用反复试验或反编译器。显然在这种情况下前者不适用,所以我使用了后者。如果您好奇,请使用您最喜欢的反编译器并检查内部类的代码 DocumentQueryEvaluator
里面Microsoft.Azure.Documents.Client.dll
.
关于C# LINQ .Any 不适用于 DocumentDb CreateDocumentQuery,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33839854/
我有这个方法: /// /// Gets a list of our documents /// /// public List List(string query) { // Retu
为什么没有 CreateDocumentQuery 的异步版本? 这个方法例如可以是异步的: using (var client = new DocumentClient(new Uri(en
我在azure documentDB平台上用c#开发。我尝试在我的应用程序中实现分页架构。我的代码: var userQuery = _client.CreateDocumentQuery(
我正在尝试让 Cosmos DB .NET SDK v1.19.1 使用 Json.net 序列化设置自动将对象反序列化为正确的类型。除了在查询文档时,这似乎工作正常。以下面的代码为例: pu
我正在尝试查询具有某种类型产品的 Art。这是我的艺术模型: public string Title { get; set; } public string Description { get
我正在为下面的代码编写单元测试,它使用带有 where(filter) 条件的文档客户端 CreateDocumentQuery 方法。 var documentQuery = ReadOnlyDo
我有一个解决方案,问题是为什么会发生这种情况以及这是否是一个好的解决方案。背景:在 Azure DocumentDb 中,我有一个托管哈希,它使用一个集合对数据库进行分区。CLR 对象继承自 Docu
我正在尝试检索存储在我的 Azure DocumentDb 中的单个实体。我发现我的代码仅在我通过 SQL 提供查询时才有效,如下所示: var query = String.Format("SELE
首次尝试访问 Cosmos 数据库。 所有这些都位于解决方案的 DAL 项目层(n 层)中。EndPointURI、PrimaryKey 和 DBName 由类构造函数设置。 我执行client.Cr
我遇到一个问题,如果我为特定查询指定分区键,我将获得我期望的记录。但是,如果我不指定分区键并将 EnableCrossPartitionQuery 设置为 true,它将不会返回/查找任何文档。 这实
我正在 .NET 应用程序中使用 Microsoft.Azure.DocumentDB.Core 版本 2.1.1 库来查询 Cosmos DB 中的数据。 下面是我用来从 Cosmos DB 查询数
我正在 .NET 应用程序中使用 Microsoft.Azure.DocumentDB.Core 版本 2.1.1 库来查询 Cosmos DB 中的数据。 下面是我用来从 Cosmos DB 查询数
我是一名优秀的程序员,十分优秀!