在查询执行后从表和过滤器中获取行子集



我使用实体框架核心与模型在SQL数据库中的所有表。

我有一个linq查询,从表中提取行-让我们称之为设施。然后,我使用fornext()迭代查询的结果(不要问):)在循环中,我们从与设施相关的各种其他表中提取数据。显然,这是一个巨大的性能问题,因为设施中可能有多达100行,这意味着每次循环迭代我们从中提取的每个额外表时都会查询DB。请注意,有些表来自另一个数据库,不能在上下文之间进行连接。已经试过了

所以,我想,在处理循环之前,让我们从相关表中取出所有的行。这样,我们只对每个关联的表调用一次db。

var pracloc = _ODSContext.AllPractitionerLocations
.Where(l => l.AllPractitionerLocationID != 0);

这很好。

下一步,让我们简化代码并将其中一些db调用拉出到类中的私有方法中。

例如:

这里是我调用方法的地方(它取代了上面的行)。

var pracloc = GetAllPractitionerLocationsDTO();

方法如下。

private AllPractitionerLocationsDTO GetAllPractitionerLocationsDTO()
{
AllPractitionerLocationsDTO dto = new();
dto.MyList = new List<AllPractitionerLocationDTO>();
var myo = _ODSContext.AllPractitionerLocations
.Where(s => s.AllPractitionerLocationID != 0)
.Select(g => new AllPractitionerLocationDTO()
{
AllPractitionerLocationID = g.AllPractitionerLocationID
});
dto.MyList = myo.ToList();
return dto;
}
下面是后面的过滤器(在上面的两个数据查询之间没有变化):
var PracLocation = pracloc
.Where(a => a.LocationID = provider.LocationID)
.FirstOrDefault();

并且,只要我像上面第一行那样通过直接查询DB来提取数据,这就可以正常工作。

当我尝试在方法中提取数据时,上面的行抛出:

' allpracticerlocationsdto '不包含'Where'的定义,也没有可访问的扩展方法'Where'接受类型' allpracticerlocationsdto '的第一个参数可以找到(您是否缺少using指令或汇编引用?)

allpracticerlocationsdto是一个模型类,它包含了"real"中的行子集。模型:

public class AllPractitionerLocationDTO
{
public int SRCAllPractitionerLocationID { get; set; }
public int AllPractitionerLocationID { get; set; }
}
public class AllPractitionerLocationsDTO
{
public List<AllPractitionerLocationDTO> MyList;
}

既然它在结构上与实际的DB表相同,为什么where子句不起作用?或者,如何在模型类中实现自己的where ?

我甚至尝试添加dbset<>到上下文。还是不行

public virtual DbSet<AllPractitionerLocationDTO> AllPractitionerLocationDTOs { get; set; }

请帮帮我。

你必须从你的方法返回IQueryable。只有在这种情况下,您才能在以后重用它并有效地进行过滤:

private IQueryable<AllPractitionerLocationDTO> GetAllPractitionerLocationsDTO()
{
var query = _ODSContext.AllPractitionerLocations
.Where(s => s.AllPractitionerLocationID != 0)
.Select(g => new AllPractitionerLocationDTO
{
AllPractitionerLocationID = g.AllPractitionerLocationID
});
return query;
}