【问题标题】:Get subset of rows from table and filter after the query is executed执行查询后从表中获取行子集并过滤
【发布时间】:2021-12-02 09:30:21
【问题描述】:

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

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

所以,我心想,让我们在处理循环之前从相关表中提取所有行。这样,我们只为每个关联的表调用一次这些数据库。

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

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

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

“AllPractitionerLocationsDTO”不包含“Where”的定义,并且找不到接受“AllPractitionerLocationsDTO”类型的第一个参数的可访问扩展方法“Where”(您是否缺少 using 指令或程序集引用?)

AllPractitionerLocationsDTO 是一个模型类,其中包含“真实”模型中的行子集:

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

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

我什至尝试将 dbset 添加到上下文中。还是不行

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

请帮帮我。

【问题讨论】:

  • 嗯,第二行是 not 精确替换第一行,因为 praclog 变量的类型不同。如果pracloc 变量类型为AllPractitionerLocationsDTO,则应使用MyList 成员进行查询,例如pracloc.MyList.Where(...)

标签: sql-server asp.net-mvc linq entity-framework-core


【解决方案1】:

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

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

    return query;
}

【讨论】:

    猜你喜欢
    • 2013-03-16
    • 1970-01-01
    • 2022-01-18
    • 2018-11-18
    • 2017-02-07
    • 1970-01-01
    • 1970-01-01
    • 2019-10-27
    • 2019-07-05
    相关资源
    最近更新 更多