3

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

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)
   });

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

4

2 回答 2

3

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

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
   };
于 2013-07-18T09:34:39.573 回答
0

你会简单地做

var listFromDatabase = context.MyTable;

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

虽然公平地说,Select需要您返回一些信息,而您不是,您在某个地方获取count&total并设置它们的值。如果你想这样做,我建议:

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

于 2013-07-18T09:34:48.937 回答