EF Core - LINQ - назначить свойство IQueryable <T> - PullRequest
0 голосов
/ 30 ноября 2018

У меня есть несколько сущностей, которые я хочу запросить с помощью 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()
    {
    }
}

У меня есть запрос, который возвращает отношения, давая идентификатор конструкции и используя сущность Link.Запрос выглядит следующим образом, и он работает как ожидалось:

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 у меня есть элемент ContextMey NotMapped, и я хочу установить этот 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 is Task , и ожидаемый тип возвращаемого значения должен быть IQueryable .

Как я могу заставить мой запрос работать и получать желаемый результат вправильный IQueryable <тип> тип?

Ответы [ 2 ]

0 голосов
/ 30 ноября 2018

Я исправил это самостоятельно, обновив запрос следующим образом:

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);

    relations.ToList().ForEach(x => x.ContextKey = 30);

    return relations;
}
0 голосов
/ 30 ноября 2018

Это одна из причин, почему я против несопоставленных свойств - они не подходят для запросов LINQ to Entities.

Вы можете использовать следующий трюк LINQ to Objects:

var updatedRelations = relations
    .AsEnumerable()
    .Select(x => { x.ContextKey = 30; return x; })
    .AsQueryable();

, но учтите, что это не настоящий запрос к EF Core, поэтому дальнейшие операции с ним, такие как фильтрация, упорядочивание, разбиение по страницам и т. Д., Будут выполняться в памяти над материализованным результатом запроса до AsEnumerable().

...