C# 如何构造一个where子句,用C中的MongoDB连接两个字符串

C# 如何构造一个where子句,用C中的MongoDB连接两个字符串,c#,linq,mongodb,C#,Linq,Mongodb,我正在尝试使用LINQ查询firstname++lastname 这就是我所尝试的: var list = from x in SomeIQueryable where (x.FirstName + " " + x.LastName).StartsWith(searchString) select new MyObject { lastname = x.LastName,

我正在尝试使用LINQ查询firstname++lastname

这就是我所尝试的:

var list =  from x in SomeIQueryable
            where (x.FirstName + " " + x.LastName).StartsWith(searchString)
            select new MyObject
            {
                lastname = x.LastName,
                firstname = x.FirstName
            };
return list.ToList();
对于MongoDB,这将返回一个异常:

System.NotSupportedException: Unable to determine the serialization information for the expression: ((x.FirstName + " ") + x.LastName).
   at MongoDB.Driver.Linq.Utils.BsonSerializationInfoFinder.GetSerializationInfo(Expression node, Dictionary`2 serializationInfoCache)
   at MongoDB.Driver.Linq.Utils.BsonSerializationInfoHelper.GetSerializationInfo(Expression node)
   at MongoDB.Driver.Linq.PredicateTranslator.BuildStringQuery(MethodCallExpression methodCallExpression)
   at MongoDB.Driver.Linq.PredicateTranslator.BuildMethodCallQuery(MethodCallExpression methodCallExpression)
   at MongoDB.Driver.Linq.PredicateTranslator.BuildQuery(Expression expression)
   at MongoDB.Driver.Linq.PredicateTranslator.BuildOrElseQuery(BinaryExpression binaryExpression)
   at MongoDB.Driver.Linq.PredicateTranslator.BuildQuery(Expression expression)
   at MongoDB.Driver.Linq.SelectQuery.BuildQuery()
   at MongoDB.Driver.Linq.SelectQuery.Execute()
   at MongoDB.Driver.Linq.MongoQueryProvider.Execute(Expression expression)
   at MongoDB.Driver.Linq.MongoQueryable`1.GetEnumerator()
   at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
   at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
   at <snip - my code>
它不喜欢它:

System.ArgumentException: Unsupported where clause: String.Concat(x.FirstName, " ", x.LastName).StartsWith("a").
   at MongoDB.Driver.Linq.PredicateTranslator.BuildQuery(Expression expression)
   at MongoDB.Driver.Linq.PredicateTranslator.BuildOrElseQuery(BinaryExpression binaryExpression)
   at MongoDB.Driver.Linq.PredicateTranslator.BuildQuery(Expression expression)
   at MongoDB.Driver.Linq.SelectQuery.BuildQuery()
   at MongoDB.Driver.Linq.SelectQuery.Execute()
   at MongoDB.Driver.Linq.MongoQueryProvider.Execute(Expression expression)
   at MongoDB.Driver.Linq.MongoQueryable`1.GetEnumerator()
   at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
   at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
   at <snip - my code>

不应该是这样的我也可能是错的:

var list =  from x in SomeIQueryable
            where (x => (x.FirstName + " " + x.LastName).StartsWith(searchString))
            select new MyObject
            {
                lastname = x.LastName,
                firstname = x.FirstName
            };
return list.ToList();

问题是MongoDB不能像普通查询那样做

不能从多个字段构造值,然后将其与通过查询发送的值进行比较:

where (x.FirstName + " " + x.LastName) 
这在MongoDB中没有直接的等价物

您可能会低效地执行JavaScript来执行连接和比较,或者使用聚合框架,而该框架不适用于LINQ

通常情况下,我建议您构建一个包含数据的字段,因为您需要将数据先放后放,可能会更改大小写,删除重音符号等,然后将其与执行相同操作的字符串进行比较

如果在运行时合并了字符串,就无法利用字段上的MongoDB索引,因此需要扫描集合中的每个文档


或者,如果可能的话,考虑将姓氏和姓氏独立地与AN../P>>结合起来,如果你正在执行方法语法,那就是:不在查询语法中。我也想到了这一点——但从文档来看,Mongo不支持计算字段。它必须是一个存储字段。这是Mongo C驱动程序的问题吗?你可以看看聚合框架-它提供了$concat操作。。。但是当您使用类似的东西时,它将根本无法使用索引进行搜索。另一个想法是尝试在两个名字上搜索,而不是组合在一起。这只是一个问题,可能错误并没有那么清楚。MongoDB不支持它。

where (x.FirstName + " " + x.LastName)