实体框架使用已选择的值保存在选择句子后面的新变量中
本文关键字:选择 新变量 变量 存在 框架 实体 保存 句子 | 更新日期: 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
要求你返回一些信息,而你没有,你正在某个地方得到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
中使用更复杂的函数