EF 查询只读 Iqueryable

本文关键字:Iqueryable 只读 查询 EF | 更新日期: 2023-09-27 18:31:04

我有几十个不同的视图,在某些视图上,来自数据库的数据必须在向用户显示之前进行操作。

例如:

var students = _repository.Students.Select(c => { c.StartDate = FixDateToCurrentYear(c.StartDate ); c.EndDate = FixDateToCurrentYear(c.EndDate); return c; }).ToList();

所以基本上我现在有一个变量,其中Students StartDateEndDate已被某种逻辑固定,目前无关紧要。

这里的问题是,每当在某个地方调用 SaveChanges() 函数时,学生更改的日期也会保存到数据库中。

我只想在特定视图中对逻辑使用更改的日期。我该如何处理?

我听说过.AsNoTracking();但这必须直接放在 DbSet 项中,但我想在控制器端处理它,可以吗?

EF 查询只读 Iqueryable

首先从数据库中拉出学生,然后选择匿名类型。EF 不知道如何跟踪这方面的更改。

var students = 
    _repository.Students.ToList()
               .Select(s => 
                   new { StartDate = FixDateToCurrentYear(c.StartDate),
                         EndDate = FixDateToCurrentYear(c.EndDate),
                         Student = s });

我能想到的最快的事情是在向用户显示修复时执行修复,例如在 Razor 中:

@FixDateToCurrentYear(student.StartDate)

这样,您实际上并没有更改值,而只是更改了它的显示方式。

如果你需要做的不仅仅是显示,你将需要创建一个分部好友类,添加一个新属性并修改其get方法:

public partial class Student
{
    DateTime StartDateComputed {
        get
        {
            return  FixDateToCurrentYear(StartDate);
        }
        set;
    }
}

现在,使用 StartDateComputed 而不是 StartDate,并且对 EndDate 也是如此。