EntityFramework Core延迟加载返回所有相关表

我的数据库中有3个表: 国别 状态 城市

我有一个API,应该返回一个带有其州的国家/地区。

但是,当我尝试执行此操作时,最终会得到一个JSON对象,其中包含国家,其统计信息以及每个州下的所有城市

我的代码是这样的(Eager和Lazy都返回相同的代码):

//Eager Loading
var countries = await _context.Countries.Include(s=>s.States).ToListAsync(cancellationToken);

//Lazy Loading
var countries = await _context.Countries.ToListAsync(cancellationToken);

我如何仅将国家/地区加载到州,然后离开城市?

dgfdfgdfgsdfg123 回答:EntityFramework Core延迟加载返回所有相关表

我的建议是永远不要返回实体。实体仅应以其DbContext作为数据模型的表示形式存在。视图或API使用的模型有不同的用途,并且应该是EF可以填充的简单,可序列化的POCO。这使他们仅适合您的视图/消费者所关注的数据。就您而言,您只关心国家和州,而不关心城市或其他相关位。您甚至可能不需要有关一个国家或州的所有数据。让EF为所需的数据建立查询。这样可以提高查询性能,减少服务器和客户端上的内存使用,并避免序列化带来的陷阱。 (即循环引用)实体应始终代表实体的完整状态。关闭延迟加载并传递不完整的实体图很容易导致错误,因为接受实体引用并面对空/空引用的方法将不知道该引用是否只是未加载或不存在。 / p>

[Serializable]
public class CountryViewModel
{
    public int CountryID { get; set; }
    public string CountryName { get; set; }
    public IEnumerable<StateViewModel> States { get; set; } = new List<StateViewModel>();
}

[Serializable]
public class StateViewModel
{
    public int StateID { get; set; }
    public string StateName { get; set; }
}

然后在获取国家和州时:

var countries = await _context.Countries
    .Select(x => new CountryViewModel
    {
        CountryId = x.CountryId,CountryName = x.Name,States = x.States.Select(s => new StateViewModel
        {
            StateId = s.StateId,StateName = s.Name
        }).ToList()
    }).ToListAsync(cancellationToken);

利用Automapper,可以很容易地将其简化为:

var countries = await _context.Countries
    .ProjectTo<CountryViewModel>()
    .ToListAsync(cancellationToken);
本文链接:https://www.f2er.com/3071766.html

大家都在问