【问题标题】:EF query readonly IqueryableEF 查询只读 Iqueryable
【发布时间】:2015-01-18 05:01:40
【问题描述】:

我有数十种不同的观点,其中一些来自数据库的数据必须在显示给用户之前进行操作。

例如:

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

所以基本上我现在有一个变量,其中 Students StartDateEndDate 已被某些逻辑修复,目前不相关。

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

我只想将更改的日期用于特定视图中的逻辑。我该怎么办?

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

【问题讨论】:

标签: c# .net entity-framework entity-framework-6 iqueryable


【解决方案1】:

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

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

【讨论】:

  • 实际上有更多的字段需要来自学生的查询,大约 20 个,并且在 2 个日期到处这样做似乎相当开销。
  • 选择两个日期连同整个学生对象进入新的匿名对象。
【解决方案2】:

我能想到的最快的方法是在您向用户显示时执行修复,例如在剃刀中:

@FixDateToCurrentYear(student.StartDate)

通过这种方式,您实际上并没有改变值,而只是改变了它的显示方式。

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

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

现在,使用 StartDateComputed 代替 StartDate,EndDate 也是如此。

【讨论】:

  • 其实不光是显示,还有100行的计算,都是基于这些日期的。
猜你喜欢
  • 1970-01-01
  • 2019-04-28
  • 2013-01-04
  • 2015-03-29
  • 1970-01-01
  • 2014-09-09
  • 1970-01-01
  • 2011-09-27
  • 2010-12-30
相关资源
最近更新 更多