C# CosmosDB文档客户端-如何为查询隐式添加类型?

C# CosmosDB文档客户端-如何为查询隐式添加类型?,c#,.net,linq,.net-core,azure-cosmosdb,C#,.net,Linq,.net Core,Azure Cosmosdb,我正在使用.NET Core 3.1中的DocumentClient for Azure Cosmos DB。我的示例查询是: var results = await _cosmosClient .CreateDocumentQuery<Employee>(_documentCollectionUri, FeedOptionsProvider.DefaultOptions<Employee>()) .Where(x => x.IdentityId == identi

我正在使用.NET Core 3.1中的DocumentClient for Azure Cosmos DB。我的示例查询是:

var results = await _cosmosClient
.CreateDocumentQuery<Employee>(_documentCollectionUri, FeedOptionsProvider.DefaultOptions<Employee>())
.Where(x => x.IdentityId == identityId)
.AsDocumentQuery()
.GetResponse();
var results=wait\u宇宙客户端
.CreateDocumentQuery(\u documentCollectionUri,FeedOptions Provider.DefaultOptions())
.其中(x=>x.IdentityId==IdentityId)
.AsDocumentQuery()
.GetResponse();

这段代码有很大的问题,因为如果数据库中有另一个具有传递条件的文档,但有另一个类型,则响应将包含该对象。我知道lambda表达式仅限于泛型类型中的公共属性,但是否有可能隐式添加检查类型正确性?数据库对象具有类似于
Discriminator
的属性,包含实体类型,但在lambda表达式中不可见。我想要的行为是检查此
鉴别器
属性的条件,而不在对象模型中使用此属性。如何做到这一点?

您可以使用下面的方法,该方法使用
QueryDefinition
类和
容器。GetItemQueryInterator
方法:

/// <summary>
/// Run a query (using Azure Cosmos DB SQL syntax) against the container
/// </summary>
private async Task QueryItemsAsync()
{
    var sqlQueryText = "SELECT * FROM c WHERE c.Discriminator = 'Value' AND c.IdentityId = 'Id'";

    Console.WriteLine("Running query: {0}\n", sqlQueryText);

    QueryDefinition queryDefinition = new QueryDefinition(sqlQueryText);
    FeedIterator<Family> queryResultSetIterator = this.container.GetItemQueryIterator<Family>(queryDefinition);

    List<Family> families = new List<Family>();

    while (queryResultSetIterator.HasMoreResults)
    {
        FeedResponse<Family> currentResultSet = await queryResultSetIterator.ReadNextAsync();
        foreach (Family family in currentResultSet)
        {
            families.Add(family);
            Console.WriteLine("\tRead {0}\n", family);
        }
    }
}
//
///对容器运行查询(使用Azure Cosmos DB SQL语法)
/// 
专用异步任务QueryItemsAsync()
{
var sqlQueryText=“从c中选择*,其中c.Discriminator='Value'和c.IdentityId='Id';
WriteLine(“正在运行的查询:{0}\n”,sqlQueryText);
QueryDefinition QueryDefinition=新的QueryDefinition(sqlQueryText);
FeedIterator queryResultSetIterator=this.container.GetItemQueryIterator(queryDefinition);
列表族=新列表();
while(queryResultSetIterator.HasMoreResults)
{
FeedResponse currentResultSet=await queryResultSetIterator.ReadNextAsync();
foreach(currentResultSet中的族)
{
家庭。添加(家庭);
Console.WriteLine(“\tRead{0}\n”,family);
}
}
}
在这里,您可以直接添加查询,该查询将根据
鉴别器
字段进行过滤


有关实施的更多详细信息,您可以访问:

谢谢您的回答,但您的解决方案并不理想。我有很多ORM设计支持的存储库,在每个存储库中,我都必须在不使用SQL查询的情况下进行查询。我想将此鉴别器添加到使用扩展方法或类似方法由LINQ表达式生成的查询中。这可能吗?哦,如果是这样的话,你能尝试在
Employee
对象中添加
Discriminator
,并直接在LINQ中添加条件吗,请在您的问题中提到,由于业务需求,您希望使用此方法。我已经提到:我希望的行为是检查此“鉴别器”属性的条件,而在对象模型中没有此属性。所以,我建议使用上述扩展方法,但这不是业务需求,只有在可能的情况下才提出。我试图避免向Employee对象添加Discriminator属性,因为我不希望域对象中的属性具有其类型的名称。如果不将其添加到类中,则无法实现此条件。