首页 > 解决方案 > LINQ。为什么只有第一次满载?

问题描述

我有一个实体Contracts,ListKindWorksKindWorks.

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不为空。但是当我改变时PageKindWork并且Subject是空的。其余的总是在变化。

为什么后续调用不加载这部分?

标签: c#entity-frameworklinqselectload

解决方案


将变量源用作 IQueryable,因此每次使用 .ToList() 查询时都会对数据库执行查询,以便您获得更改的数据。

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

这会将其保存为查询(没有数据,因为它尚未在 db 上执行)

每次调用 .ToList() EF 都会在 sql 上执行。

var smth = source.ToList();

推荐阅读