C# 具有lambda表达式且一个参数为null的查询

C# 具有lambda表达式且一个参数为null的查询,c#,lambda,azure-cosmosdb,C#,Lambda,Azure Cosmosdb,我想用lambda表达式进行查询。 我的数据库是Cosmos数据库。 我想筛选两个参数,其中一个可以为null 例如,我想搜索name和lastname,两者中的一个为null 这就是我正在尝试的: var result = this._client.CreateDocumentQuery<Person>( UriFactory.CreateDocumentCollectionUri(_idDatabase, _idCollection), q

我想用lambda表达式进行查询。 我的数据库是Cosmos数据库。 我想筛选两个参数,其中一个可以为null

例如,我想搜索name和lastname,两者中的一个为null

这就是我正在尝试的:

var result = this._client.CreateDocumentQuery<Person>(
                    UriFactory.CreateDocumentCollectionUri(_idDatabase, _idCollection), queryOptions)
                    .Where((f) => f.Name == Name && f.LastName == lastName )
                    .AsEnumerable()
                    .ToList();
var result=this.\u client.CreateDocumentQuery(
CreateDocumentCollectionUri(_-idDatabase,_-idCollection),查询选项)
.Where((f)=>f.Name==Name&&f.LastName==LastName)
.可计算的()
.ToList();
那么这是什么

var result = this._client.CreateDocumentQuery<Person>(
    UriFactory.CreateDocumentCollectionUri(_idDatabase, _idCollection), queryOptions)
    .Where((f) => (f.Name == Name || (f.Name == null && f.LastName != null)) && (f.LastName == lastName || (f.LastName == null && f.Name != null))
    .AsEnumerable()
    .ToList();
var result=this.\u client.CreateDocumentQuery(
CreateDocumentCollectionUri(_-idDatabase,_-idCollection),查询选项)
。其中((f)=>(f.Name==Name | |(f.Name==null&&f.LastName!=null))&&(f.LastName==LastName | |(f.LastName==null&&f.Name!=null))
.可计算的()
.ToList();

也许您可以使用IQueryable:

IQueryable<Person> iPerson = this._client.CreateDocumentQuery<Person>(
                    UriFactory.CreateDocumentCollectionUri(_idDatabase, _idCollection), queryOptions);

if(Name != null) iPerson = iPerson.Where(f => f.Name == Name);
if(lastName != null) iPerson = iPerson.Where(f => f.LastName == lastName)
return iPerson.AsEnumerable().ToList();
IQueryable-iPerson=this.\u client.CreateDocumentQuery(
CreateDocumentCollectionUri(_-idDatabase,_-idCollection),查询选项;
如果(Name!=null)iPerson=iPerson.Where(f=>f.Name==Name);
if(lastName!=null)iPerson=iPerson.Where(f=>f.lastName==lastName)
返回iPerson.AsEnumerable().ToList();

尝试以下方法:

var result = this._client.CreateDocumentQuery<Person>(
                    UriFactory.CreateDocumentCollectionUri(_idDatabase, _idCollection), queryOptions)
                    .Where(f => f.Name == $"{Name ?? f.Name}") &&
                                f.LastName == $"{lastName ?? f.LastName}")  )
                    .AsEnumerable()
                    .ToList();
var result=this.\u client.CreateDocumentQuery(
CreateDocumentCollectionUri(_-idDatabase,_-idCollection),查询选项)
.Where(f=>f.Name==$“{Name??f.Name}”)&&
f、 LastName==$“{LastName??f.LastName}”))
.可计算的()
.ToList();

CosmosDB SDK不能很好地使用
Equals
方法。它在执行LINQ到SQL转换时抛出NotSupported异常。最重要的是,您的queryable实际上不会返回任何内容,因为一个简单的
ToList()
将不起作用。SDK需要一个可枚举项才能使用
ToList
方法返回数据。真奇怪。另外,他还说他希望过滤器在两个值中的一个为空时工作,而不是两个都为空。@nick Chapsas:好的。作为hornest,我还没有使用CosmosDB SDK,只是想给出一个想法。很抱歉弄糊涂了;)但还是不完全符合他的要求。“我想筛选两个参数,其中一个可以为null”。两个参数中的一个可以为null。当两者都为null或都已设置时是什么情况?同样,这应该让CMorillo知道如何使用IQueryable编写干净的解决方案。这对CosmosDB不起作用,因为它不支持
like
关键字。@NickChapsa这个怎么样?仍然与他的问题不符。他说,“我想过滤两个参数,其中一个可以为空。”。当两个都为空时,你的解决方案也可以工作。那么,如果两个都为空,你认为会发生什么呢?这句话很长,我想要更优雅的东西抱歉什么?您是否希望我们为您提供一个基本C#问题的完整优雅解决方案?StackOverflow不是为了这个。你有一个指针,并且对你的问题有一个有效的答案。你可以从那里拿走。快速重构是将谓词提取到它自己的函数中并重用它。也许这个解决方案可行,但我同意CMorillo的观点,这不是最干净的方法,也很难维护。在这里,此解决方案无法通过代码审查。@SNO不需要。我认为你没有抓住重点。因此,没有为请求提供完整的解决方案。它提供问题的答案。拥有一个名为
Name
的属性和另一个名为
LastName
的属性也不会通过代码审查。类似于这样的单行if语句
if(Name!=null)iPerson=iPerson.Where(f=>f.Name==Name),但这不是重点,是吗?