LINQ.Почему полная загрузка только с первого раза? - PullRequest
0 голосов
/ 09 июля 2019

У меня есть сущность Contracts, ListKindWorks и KindWorks.

public partial class Contracts
{
    public Contracts()
    {
        ListKindWorks = new HashSet<ListKindWorks>();
    }

    public int Id { get; set; }
    ...
    public virtual ICollection<ListKindWorks> ListKindWorks { get; set; }
}

public partial class ListKindWorks
{
    public int IdContract { get; set; }
    public int IdKindWork { get; set; }

    public virtual Contracts IdContractNavigation { get; set; }
    public virtual KindWorks IdKindWorkNavigation { get; set; }
}

public partial class KindWorks
{
    public KindWorks()
    {
        ListKindWorks = new HashSet<ListKindWorks>();
    }

    public int Id { get; set; }
    public string Title { get; set; }
    public virtual ICollection<ListKindWorks> ListKindWorks { get; set; }
}

И класс Item

public class Item
{
    public int Id { get; set; }
    public string Value { get; set; }
}

Я хочу загрузить связанные элементы с помощью метода Load():

source = model.Contracts
    .OrderByDescending(r => r.Id)
    .Skip(Page * Size)
    .Take(Size)
    .Select(c => new ContractTableRow
    {
        IdContract = c.Id,
        FullName = c.WorkerNavigation.FullName,
        IdWorker = c.Worker,
        ...

        // this code
        KindWork = c.ListKindWorks
        .Select(y => new Item 
        { Id = y.IdKindWork, Value = y.IdKindWorkNavigation.Short })
        .ToList(),

        Subject = c.ListSubjects
        .Select(y => new Item
        { Id = y.IdSubject, Value = y.IdSubjectNavigation.Short })
        .ToList()
    })
    .ToList();

Первый вызов методаLoad() (во время загрузки приложения) дает полные элементы.KindWork и Subject не пусты.Но потом, когда я меняю Page, KindWork и Subject становятся пустыми.Остальное всегда меняется.

Почему последующие звонки не загружают эту часть?

1 Ответ

1 голос
/ 09 июля 2019

Используйте переменную source как IQueryable, поэтому каждый раз, когда вы используете запрос .ToList () к базе данных, вы получаете измененные данные.

IQueryable<Contracts> source = *...* // without .ToList()

Это сохранит это как запрос (без данных, так как он еще не выполнен в БД)

Каждый раз, когда вы вызываете .ToList () EF будет выполняться на sql.

var smth = source.ToList();
...