.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
您的 类 有几个问题。
首先,我假设你在 township
和 suppliers
之间有 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
没有任何关系
我有几个关于 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
您的 类 有几个问题。
首先,我假设你在 township
和 suppliers
之间有 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