我有第一个返回一组实体的查询:
var resultSet = ....query....ToList();
将返回A,B,C,D,E
这个集合中的实体被组织成链,因为它们有一个指向同一类型实体的引用(prevEntityId),即:
A - > B - > d
C - > ë
我想写第二个查询,以便现在只返回A和C,但我不知道如何编写它。
我更倾向于使用linq方法(如.Where())而不是新的linq语法。
谢谢
更新:抱歉,我最初使用“外键”一词在我的问题中使用了错误的词汇。实际上,实体具有对前一实体的直接引用,因此要在第二个查询中选择实体,必须没有其他实体引用它。我认为这需要2个查询,但如果你认为它可以在一个...
答案 0 :(得分:1)
编辑:好的,由于这种关系与我的预期相反,你正在寻找的实体没有任何实体将其作为前一个实体。
一个选项:
Where(x => !fullList.Any(y => y.PrevEntityId == x.Id));
现在,如果你的查询实际上是在SQL中执行的,那么值得看看它产生了什么 - 它可能效率不高。它肯定不会在LINQ to Objects中高效。对于LINQ to Objects,你最好用:
HashSet<string> prevIds = new HashSet<string>(fullList.Select(x => x.PrevId));
var heads = fullList.Where(x => !prevIds.Contains(x));
如果您可以获得有关您的环境的更多信息,那将有助于我们为您提供帮助。
答案 1 :(得分:0)
我不是100%明确你的实体及其关系,但这会让你开始。
听起来您现在正在尝试从resultSet
对象进一步查询。如果想要A和C,那么听起来就像FK会为空。
var cEntities = resultSet.Where(e=>e.prevEntityID == null).ToList();
答案 2 :(得分:0)
您可以编写一个辅助函数,给定链中的最后一个实体为您提供第一个实体。然后你可以将它与pcampbell的答案结合起来获得链中的第一个实体。沿着这些方向的东西
resultSet.Where(e=>e.prevEntityID == null).Select(e => GetHead(e, resultSet)).ToList();
Entity GetHead(Entity current, List<Entity> entities)
{
Entity next = entities.Where(e => e.prevEntityID = current.id).FirstOrDefault();
if (next == null)
return current;
else
return GetHead(next, entities);
}