【发布时间】:2018-11-30 09:44:00
【问题描述】:
我想使用 LINQ 查询一些实体:
public class Link: Entity, IAggregateRoot
{
public Guid RelationId { get; private set; }
public Guid ConstructionId { get; private set; }
public virtual Relation Relation { get; private set; }
public virtual Construction Construction { get; private set; }
private Link()
{
}
}
public class Relation: Entity, IAggregateRoot
{
public string Number { get; private set; }
public Guid PersonId { get; private set; }
public Guid RelationTypeId { get; private set; }
public virtual Person Person { get; private set; }
public virtual RelationType RelationType { get; private set; }
[NotMapped]
public int ContextKey { get; set; }
private Relation()
{
}
}
我有一个查询,它通过提供构造 id 并使用链接实体来返回关系。查询如下,按预期工作:
public IQueryable<Relation> GetRelationsByConstructionId(Guid constructionId)
{
var links base.Get(x => x.Construction.ConstructionId == constructionId);
var relations = links.Include(x => x.Relation)
.Select(x => x.Relation)
.Include(x => x.Person)
.Include(x => x.RelationType);
return relations;
}
在 Relation 中,我有一个 NotMapped 元素 ContextKey,我想在查询调用中设置这个 ContextKey(例如,我想将它设置为 30)。基本上我想做这样的事情来扩展我使用的查询:
public IQueryable<Relation> GetRelationsByConstructionId(Guid constructionId)
{
var links base.Get(x => x.Construction.ConstructionId == constructionId);
var relations = links.Include(x => x.Relation)
.Select(x => x.Relation)
.Include(x => x.Person)
.Include(x => x.RelationType);
var updatedRelations = relations.ForEachAsync(x => x.ContextKey = 30);
return updatedRelations;
}
当然这不起作用,因为在 ForEachAsync 之后 updatedRelations 的类型是 Task 并且预期的返回类型必须是IQueryable.
我怎样才能使我的查询工作并以正确的 IQueryable 类型获得我想要的输出?
【问题讨论】:
-
直接的解决方法是在适当的位置添加
async和await,但如果异步的唯一原因是使用ForEachAsync,那就太过分了。您的代码中有更多错误或可疑之处:1)var links base.Get...甚至无法编译。 2) 第一个Include是多余的,并且 3)(最重要的是)这个查询不一定返回不同的关系,因为多个构造可能具有相同的关系。如果您需要关系,请使用遍历到constructionId的谓词直接查询关系。 (Relation需要一个Links导航属性)。
标签: entity-framework linq iqueryable