.NET Core/EF:如何避免 Linq 查询的性能问题?

.NET Core / EF : how to avoid performance issue with Linq query?

我有几个关于 lambda 过滤性能的问题。

这是我的代码:

public class supplier 
{
    public Guid supplier_id { get; set; }
    public string supplier_name { get; set; }
    public Guid township_id { get; set; }
}

public class township
{
    public Guid township_id { get; set; }
    public string township { get; set; }
}

这是我的 dto class:

public class supplier_dto 
{
    public Guid supplier_id { get; set; }
    public string suppliername { get; set; }
    public Township township { get; set; }
}

那么为什么我使用 Linq 过滤列表:

var supplier_list = (from sup on _dbcontext.suppliers
                     join twn on _dbcontext.townships on sup.township_id equals twn.township_id
                     select new supplier_dto  
                                {
                                    supplier_id = sup.supplier_id,
                                    suppliername = sup.supplier_name,
                                    township = getTownshipById(twn.township_id)
                                }).ToList();

如果供应商很多,会不会影响性能?有没有不使用 getTownshipById 函数的方法?

BR, jm

您的 类 有几个问题。 首先,我假设你在 townshipsuppliers 之间有 one-to-many 关系,这通常由数据库中的外键表示。因此你必须在模型中有相似的关系:

public class supplier 
{
    public Guid supplier_id { get; set; }
    public string supplier_name { get; set; }
    public Guid TownshipId { get; set; }
    public Township township { get; set; }
}

public class Township
{
    public Guid TownshipId { get; set; }
    public string name { get; set; }
    public ICollection<supplier> suppliers { get; set; }
}

如果是这样,您可以重写 LINQ 语句:

var supplier_list = (from sup in _dbcontext.suppliers
                     select new supplier_dto  
                                {
                                    supplier_id = sup.supplier_id,
                                    suppliername = sup.supplier_name,
                                    township = sup.township
                                }).ToList();

只需确保 township 已通过预加载或显式加载实际加载。一般来说,如果你需要在 LINQ 语句中使用 join,我认为它是代码味道。

其次,LINQ 查询的性能取决于它生成的查询。你把.NET 3.1 的标签。在 .NET 5 中,您可以使用简单的 API ToQueryString() 来获取结果查询;但即使在 3.1 中,您也可以更努力地生成它。

最后,你的问题与lambda

没有任何关系