Ben*_*tra 2 c# linq azure-cosmosdb
我的DocumentDB文档有一个.NET POCO类.
public class FatDocument{
public string id { get; set; }
public string LightProperty { get;set;}
public string LightProperty2 { get;set;}
public string FatProperty { get;set;}
}
Run Code Online (Sandbox Code Playgroud)
顾名思义,FatProperty包含Document的大部分信息.我的DocumentDB集合中的所有文档实际上都是FatDocument的JSON序列化版本.
出于我的业务应用程序中的许多目的,我不需要检索FatProperty.为了节省一些RU,我创建了POCO的简易版本.
public class LightDocument{
public string id { get; set; }
public string LightProperty { get;set;}
public string LightProperty2 { get;set;}
}
public class FatDocument: LightDocument{
public string FatProperty { get;set;}
}
Run Code Online (Sandbox Code Playgroud)
现在我正在寻找一种方法来检索IQueryable<LightDocument>.
如果我创建一个QueryDocumentwith client.CreateDocumentQuery<LightDocument>,执行后,这个IQueryable返回一个LightDocument枚举.但在DocumentDB请求检查后,我们看到了一个SELECT * FROM.这不是我们想要的,我们想FatProperty在DocumentDB查询中忽略以保存一些RU(并在客户端应用程序和DocumentDB之间请求有效负载).
我还尝试使用SQL语法组合创建查询
var queryspec = new SqlQuerySpec() { QueryText = "SELECT c.id, c.LightProperty, c.LightProperty2"};
var queryable = client.CreateDocumentQuery<LightDocument>(GetDocUri(), queryspec);
queryable.Where(c => /* Some filtering logic */);
queryable.AsEnumerable(); //EXCEPTION thrown
Run Code Online (Sandbox Code Playgroud)
这会引发异常Method 'AsSQL' is not supported. Only LINQ Methods are supported.
注意:反转AsEnumerable和Where不是一个选项.我们希望将该where子句翻译成DocumentDB where子句.
我的问题是:如何使用DocumentDB .NET SDK返回部分文档来创建LINQ查询?
如果使用LINQ而不是SQL查询,则可以使用IQueriable上的.Select()方法将fat文档投影到light文档.然后,您可以将结果链接到.Where()方法.
轻型文档查询
var lightDocumentQuery = client.CreateDocumentQuery<LightDocument>(GetCollectionLink())
.Select(d => new LightDocument { id = d.id, LightProperty = d.LightProperty, LightProperty2 = d.LightProperty2 })
.Where(d => d.LightProperty == compareTo)
.AsDocumentQuery();
Run Code Online (Sandbox Code Playgroud)
轻文档结果
{
"id": "9d4ec687-95a5-68df-d51d-5d2fb0143231",
"LightProperty": "someValue",
"LightProperty2": "someOtherValue"
}
Run Code Online (Sandbox Code Playgroud)
胖文档查询
var fatDocumentQuery = client.CreateDocumentQuery<FatDocument>(GetCollectionLink())
.Where(d => d.LightProperty == compareTo)
.AsDocumentQuery();
Run Code Online (Sandbox Code Playgroud)
胖文件结果
{
"FatProperty": "SomeFatProperty usually json",
"id": "9d4ec687-95a5-68df-d51d-5d2fb0143231",
"LightProperty": "someValue",
"LightProperty2": "someOtherValue"
}
Run Code Online (Sandbox Code Playgroud)
轻量级文档示例中的结果查询不引用FatProperty,因此不会通过网络发送.我继续检查每个请求类型的RU,它们几乎是偶数,FatDocument查询的成本略高,这是合理的,因为使用的带宽更多.
| 归档时间: |
|
| 查看次数: |
1555 次 |
| 最近记录: |