C# 如何构造一个where子句,用C中的MongoDB连接两个字符串
我正在尝试使用LINQ查询firstname++lastname 这就是我所尝试的: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,
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)