实体框架使用已选择的值保存在选择句子后面的新变量中

本文关键字:选择 新变量 变量 存在 框架 实体 保存 句子 | 更新日期: 2023-09-27 18:23:48

我写了一些实体框架选择:

var query = context.MyTable
   .Select(a => new
   {
      count = a.OtherTable.Where(b => b.id == id).Sum(c => c.value),
      total = a.OtherTable2.Where(d => d.id == id) * count ...
   });

我总是选择总计:

var query = context.MyTable
   .Select(a => new
   {
      count = a.OtherTable.Where(b => b.id == id).Sum(c => c.value),
      total = a.OtherTable2.Where(d => d.id == id) * a.OtherTable.Where(b => b.id == id).Sum(c => c.value)
   });

是否可以像我的第一个示例中那样选择它,因为我已经检索了该值(以及如何执行此操作(还是应该再次选择它?

实体框架使用已选择的值保存在选择句子后面的新变量中

一种可能的方法是使用两个连续的选择:

var query = context.MyTable
   .Select(a => new
   {
      count = a.OtherTable.Where(b => b.id == id).Sum(c => c.value),
      total = a.OtherTable2.Where(d => d.id == id)
   })
   .Select(x => new 
   {
      count = x.count,
      total = x.total * x.count
   };

你只需要做

var listFromDatabase = context.MyTable;
var query1 = listFromDatabase.Select(a => // do something );
var query2 = listFromDatabase.Select(a => // do something );

虽然公平地说,Select要求你返回一些信息,而你没有,你正在某个地方得到counttotal并设置他们的值。如果你想这样做,我建议:

var listFromDatabase = context.MyTable.ToList();
listFromDatabase.ForEach(x =>
{
     count = do_some_counting;
     total = do_some_totalling;
});

请注意,ToList()函数会阻止IQueryable并将其转换为实心列表,List对象也允许Linq ForEach

如果你要在Select里做复杂的事情,我总是会这样做:

context.MyTable.AsEnumerable()

因为这样您就不会尝试仍然从数据库中Query

所以回顾一下:对于顶部,我的观点是将所有表内容放入变量中,使用 ToList() 获得实际结果(执行工作负载(。其次,如果尝试从直接Query使用AsEnumerable允许在Select中使用更复杂的函数