我正在尝试针对 Mongo DB C# 驱动程序编写一个 linq 查询,以便从一个集合中拉回文档,而这些文档在另一个集合中没有相应的相关记录。 A 是帐户文档,R 是参考文档,它们具有不同的架构,但基本上通过某些字段中的数据相关。
为了执行此请求,我提出了以下查询:
var result = (from a in _accountCollection.AsQueryable()
join r in _externalReferenceCollection.AsQueryable()
on new { Id = a.Id, CollectionName = "account", Key = "cimAccountId" } equals new { Id = r.TargetId, CollectionName = r.CollectionName, Key = r.Key } into ar
where !ar.Any()
select a).Take(batchSize);
但是,尽管编译没有错误,但当我运行此表达式时,我收到以下错误:
不支持表达式:a => new <>f__AnonymousType1`3(Id = a.Id, CollectionName = "account", Key = "cimAccountId") 因为表达式无法转换为字段路径。
我不明白 Linq 在这里试图做什么,因为它似乎在集合之间的联接中使用的匿名类型与选择中请求的返回类型不相同之间存在问题。
谁能告诉我上面的内容有什么问题吗?
我认为你可以将你的 linq 更改为:
var result = from a in accounts
join r in externalReferences on a.Id equals r.TargetId into ar
where !ar.Any(r => r.Key == "cimAccountId" && r.CollectionName == "account")
select a;
我用一些简单的数据验证了它:
var accounts = new List<Account>
{
new Account {Id = 1},
new Account {Id = 2},
new Account {Id = 3},
};
var externalReferences = new List<ExternalReference>
{
new ExternalReference {TargetId = 1, CollectionName = "account", Key = "cimAccountId"},
new ExternalReference {TargetId = 1, CollectionName = "account_Invalid", Key = "cimAccountId_Invalid"},
new ExternalReference {TargetId = 2, CollectionName = "account_Invalid", Key = "cimAccountId_Invalid"},
new ExternalReference {TargetId = 3, CollectionName = "account", Key = "cimAccountId"},
};
结果是带有
Id=2
的账户,即外部引用集合中唯一没有 collectionName = "account" 且 key="cimAccountId" 记录的账户。