LINQ。为什么只在第一次满载?
LINQ. Why full load only the first time?
我有一个实体 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; }
}
和classItem
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
是空的。其余的总是在变化。
为什么后续调用不加载这部分?
将变量源用作 IQueryable,这样每次使用 .ToList() 查询时都会针对数据库执行查询,这样您就会得到更改后的数据。
IQueryable<Contracts> source = *...* // without .ToList()
这会将其保存为查询(没有数据,因为它尚未在数据库上执行)
每次调用 .ToList() 时,EF 都会在 sql.
上执行
var smth = source.ToList();
我有一个实体 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; }
}
和classItem
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
是空的。其余的总是在变化。
为什么后续调用不加载这部分?
将变量源用作 IQueryable,这样每次使用 .ToList() 查询时都会针对数据库执行查询,这样您就会得到更改后的数据。
IQueryable<Contracts> source = *...* // without .ToList()
这会将其保存为查询(没有数据,因为它尚未在数据库上执行)
每次调用 .ToList() 时,EF 都会在 sql.
上执行var smth = source.ToList();