C# EF查询只读可查询

C# EF查询只读可查询,c#,.net,entity-framework,entity-framework-6,iqueryable,C#,.net,Entity Framework,Entity Framework 6,Iqueryable,我有几十种不同的视图,其中一些来自数据库的数据必须在显示给用户之前进行处理 例如: var students = _repository.Students.Select(c => { c.StartDate = FixDateToCurrentYear(c.StartDate ); c.EndDate = FixDateToCurrentYear(c.EndDate); return c; }).ToList(); 所以基本上我现在有一个变量,StudentsStartDate和EndD

我有几十种不同的视图,其中一些来自数据库的数据必须在显示给用户之前进行处理

例如:

var students = _repository.Students.Select(c => { c.StartDate = FixDateToCurrentYear(c.StartDate ); c.EndDate = FixDateToCurrentYear(c.EndDate); return c; }).ToList();
所以基本上我现在有一个变量,
Students
StartDate
EndDate
已经被一些逻辑固定了,这在目前是不相关的

这里的问题是,每当调用SaveChanges()函数时,学生的更改日期也会持久化到数据库中

我只想在特定视图中为逻辑使用更改的日期。我该怎么办


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

首先从数据库中拉学生,然后执行一个选择到匿名类型。EF不知道如何跟踪这方面的变化

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

我能想到的最快的方法是在向用户显示修复的位置执行修复,例如在Razor中:

@FixDateToCurrentYear(student.StartDate)
这样,您实际上并没有改变值,您只是改变了它的显示方式

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

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

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

我听说过.AsNoTracking();但这必须直接放在DbSet项上,你是说这是
DbSet
上的扩展方法吗?因为它似乎不是(免责声明:EF5)你是说AsNoTracking也应该在IQueryable上吗?由于某种原因,它没有显示给我。但这是为我的数据库集显示的事实上,这不仅仅是关于显示,还有100行计算,都是基于这些日期的。实际上还有更多的字段需要学生查询,大约20行,在任何地方为两个日期执行此操作似乎都是相当大的开销。将这两个日期与整个student对象一起选择到新的匿名对象中。