LINQ-to-MongoDB - Return 仅当两列之间的值匹配时列出
LINQ-to-MongoDB - Return list only when values between 2 columns match
我有一个MongoDBcollection。这是源数据的网格 (excel) 视图。
如果 "fstick" 列的值与同一 collection 中 "sedol" 列的值匹配,我只想 return 一个列表。最后,我想要这个:
这是我目前尝试过的方法:
var list1 = collection.AsQueryable();
var list2 = collection.AsQueryable();
var docs = list1.Where(c => list2.Any(a => a.Sedol == c.FSTicker));
还有这个:
var docs = collection.AsQueryable()
.Where(c => c.FSTicker.Contains(c.Sedol));
每次,我都会收到以下错误:
System.ArgumentException: Unsupported filter: {document}{fstick}.Contains({document}{sedol}).
at MongoDB.Driver.Linq.Translators.PredicateTranslator.Translate(Expression node)
at MongoDB.Driver.Linq.Translators.PredicateTranslator.Translate(Expression node, IBsonSerializerRegistry serializerRegistry)
at MongoDB.Driver.Linq.Translators.QueryableTranslator.TranslateWhere(WhereExpression node)
at MongoDB.Driver.Linq.Translators.QueryableTranslator.Translate(Expression node)
at MongoDB.Driver.Linq.Translators.QueryableTranslator.TranslatePipeline(PipelineExpression node)
at MongoDB.Driver.Linq.Translators.QueryableTranslator.Translate(Expression node)
at MongoDB.Driver.Linq.Translators.QueryableTranslator.Translate(Expression node, IBsonSerializerRegistry serializerRegistry)
at MongoDB.Driver.Linq.MongoQueryProviderImpl`1.Translate(Expression expression)
at MongoDB.Driver.Linq.MongoQueryProviderImpl`1.Execute(Expression expression)
at MongoDB.Driver.Linq.MongoQueryableImpl`2.GetEnumerator()
以防万一,这是我的 class:
[BsonIgnoreExtraElements]
public class Datapull
{
[BsonElement("fstick")]
public string FSTicker { get; set; }
[BsonElement("sedol")]
public string Sedol { get; set; }
[BsonElement("exchange")]
public string Exchange { get; set; }
[BsonElement("localtick")]
public string LocalTicker { get; set; }
[BsonElement("compname")]
public string Company { get; set; }
}
我应该对 LINQ 查询进行哪些更改才能使其正常工作?
附加信息:
- MongoDB版本:3.0.4
- C# 驱动程序:2.2.4
Json 文档转储(从 MongoChef 导出并修改)
[{
"fstick" : "25881xx",
"exchange" : "OTC",
"localtick" : "MSFT",
"sedol" : "25881xx",
"compname" : "Microsoft Corporation",
"currency" : "USD",
"closedate" : "2016-07-11"
}, {
"fstick" : "2046xxx",
"exchange" : "NASDQ",
"localtick" : "AAPL",
"sedol" : "2046xxx",
"compname" : "Apple Inc.",
"currency" : "USD",
"closedate" : "2016-07-11"
}, {
"fstick" : "BCBHZxx",
"exchange" : "NASDQ",
"localtick" : "BBRY",
"sedol" : "BCBHZxx",
"compname" : "BlackBerry Limited",
"currency" : "USD",
"closedate" : "2016-07-11"
}, {
"fstick" : "BB-CA",
"exchange" : "TSE",
"localtick" : "BB",
"sedol" : "BCBHZ3x",
"compname" : "BlackBerry Limited",
"currency" : "CAD",
"closedate" : "2016-07-11"
}
]
当我们需要比较同一文档中的两个字段时,这探讨了一个问题,
请找到使用聚合框架的片段。
Datapull
class 为此获得了额外的字段:
public bool IsTrue { get; set; }
下面的 C# 聚合框架片段
var data = collection.Aggregate();
var a1 =
data.Project(
x =>
new
{
FSTicker = x.FSTicker,
Sedol = x.Sedol,
Company = x.Company,
Exchange = x.Exchange,
LocalTicker = x.LocalTicker,
IsTrue = (x.Sedol == x.FSTicker)
});
var a2 = a1.Match(x => x.IsTrue);
var result = a2.ToList();
编辑
这里的问题是基于事实,即 mongo 本身没有方法来比较相同文档上的字段,这对于来自 SQL 世界的人们来说是很自然的事情。
Mongo 有一个 $where
子句——它是一个 javascript 注入,我们可以传递这样一个片段来对从我们的数据集中返回的每个文档进行操作,但 linq 查询不是翻译成使用这个。
这里有一个 JIRA 票证:jira
编辑 2
请从 repo 下载示例 - 可能缺少某些内容
下面是工作解决方案的屏幕截图
Git 回购 here
欢迎大家评论!
以下答案归功于@Ciro Corvino:
var docs = collection.AsEnumerable().Where(c => c.FSTicker.Equals(c.Sedol));
我有一个MongoDBcollection。这是源数据的网格 (excel) 视图。
如果 "fstick" 列的值与同一 collection 中 "sedol" 列的值匹配,我只想 return 一个列表。最后,我想要这个:
这是我目前尝试过的方法:
var list1 = collection.AsQueryable();
var list2 = collection.AsQueryable();
var docs = list1.Where(c => list2.Any(a => a.Sedol == c.FSTicker));
还有这个:
var docs = collection.AsQueryable()
.Where(c => c.FSTicker.Contains(c.Sedol));
每次,我都会收到以下错误:
System.ArgumentException: Unsupported filter: {document}{fstick}.Contains({document}{sedol}).
at MongoDB.Driver.Linq.Translators.PredicateTranslator.Translate(Expression node)
at MongoDB.Driver.Linq.Translators.PredicateTranslator.Translate(Expression node, IBsonSerializerRegistry serializerRegistry)
at MongoDB.Driver.Linq.Translators.QueryableTranslator.TranslateWhere(WhereExpression node)
at MongoDB.Driver.Linq.Translators.QueryableTranslator.Translate(Expression node)
at MongoDB.Driver.Linq.Translators.QueryableTranslator.TranslatePipeline(PipelineExpression node)
at MongoDB.Driver.Linq.Translators.QueryableTranslator.Translate(Expression node)
at MongoDB.Driver.Linq.Translators.QueryableTranslator.Translate(Expression node, IBsonSerializerRegistry serializerRegistry)
at MongoDB.Driver.Linq.MongoQueryProviderImpl`1.Translate(Expression expression)
at MongoDB.Driver.Linq.MongoQueryProviderImpl`1.Execute(Expression expression)
at MongoDB.Driver.Linq.MongoQueryableImpl`2.GetEnumerator()
以防万一,这是我的 class:
[BsonIgnoreExtraElements]
public class Datapull
{
[BsonElement("fstick")]
public string FSTicker { get; set; }
[BsonElement("sedol")]
public string Sedol { get; set; }
[BsonElement("exchange")]
public string Exchange { get; set; }
[BsonElement("localtick")]
public string LocalTicker { get; set; }
[BsonElement("compname")]
public string Company { get; set; }
}
我应该对 LINQ 查询进行哪些更改才能使其正常工作?
附加信息:
- MongoDB版本:3.0.4
- C# 驱动程序:2.2.4
Json 文档转储(从 MongoChef 导出并修改)
[{ "fstick" : "25881xx", "exchange" : "OTC", "localtick" : "MSFT", "sedol" : "25881xx", "compname" : "Microsoft Corporation", "currency" : "USD", "closedate" : "2016-07-11" }, { "fstick" : "2046xxx", "exchange" : "NASDQ", "localtick" : "AAPL", "sedol" : "2046xxx", "compname" : "Apple Inc.", "currency" : "USD", "closedate" : "2016-07-11" }, { "fstick" : "BCBHZxx", "exchange" : "NASDQ", "localtick" : "BBRY", "sedol" : "BCBHZxx", "compname" : "BlackBerry Limited", "currency" : "USD", "closedate" : "2016-07-11" }, { "fstick" : "BB-CA", "exchange" : "TSE", "localtick" : "BB", "sedol" : "BCBHZ3x", "compname" : "BlackBerry Limited", "currency" : "CAD", "closedate" : "2016-07-11" } ]
当我们需要比较同一文档中的两个字段时,这探讨了一个问题, 请找到使用聚合框架的片段。
Datapull
class 为此获得了额外的字段:
public bool IsTrue { get; set; }
下面的 C# 聚合框架片段
var data = collection.Aggregate();
var a1 =
data.Project(
x =>
new
{
FSTicker = x.FSTicker,
Sedol = x.Sedol,
Company = x.Company,
Exchange = x.Exchange,
LocalTicker = x.LocalTicker,
IsTrue = (x.Sedol == x.FSTicker)
});
var a2 = a1.Match(x => x.IsTrue);
var result = a2.ToList();
编辑
这里的问题是基于事实,即 mongo 本身没有方法来比较相同文档上的字段,这对于来自 SQL 世界的人们来说是很自然的事情。
Mongo 有一个 $where
子句——它是一个 javascript 注入,我们可以传递这样一个片段来对从我们的数据集中返回的每个文档进行操作,但 linq 查询不是翻译成使用这个。
这里有一个 JIRA 票证:jira
编辑 2
请从 repo 下载示例 - 可能缺少某些内容 下面是工作解决方案的屏幕截图
Git 回购 here
欢迎大家评论!
以下答案归功于@Ciro Corvino:
var docs = collection.AsEnumerable().Where(c => c.FSTicker.Equals(c.Sedol));