【问题标题】:Query performance on DefaultIfEmpty with null property使用 null 属性查询 DefaultIfEmpty 的性能
【发布时间】:2020-04-22 15:28:53
【问题描述】:

我写了一个查询来获取这样的数据

public class NewsResModel
{
    public string Title { get; set; }
}

IQueryable<NewsResModel> query = FindByCondition(
            o.Title.Contains(qModel.Titel ?? String.Empty))
            .Select(x => new NewsResModel {
                Title = x.Title
            }).AsNoTracking();

在我称为查询的通用类中:

List<T> items = await query.DefaultIfEmpty().ToListAsync();

删除DefaultIfEmpty 并进行如下查询是否更好:

.Select(x => new NewsResModel {
                Title = x.Title ?? ""
            })

我在NewsResModel 中有更多的空字符串属性,其他一些类也将使用这个通用方法返回item&lt; T &gt;

【问题讨论】:

    标签: c# performance linq linq-to-sql entity-framework-core


    【解决方案1】:

    首先,您对性能的定义时间是多少?秒?毫秒?

    通过禁用延迟加载或跟踪来配置 dbcontext 确实会提高性能

    但是,如果您真的想加快查询速度,我建议您不要返回一个类的所有字段,而是只返回您将使用的那些。

    DefaultIfEmpty() 等价于 SQL 查询中的 LEFT JOIN

    所以要问的问题是:将 JOIN 更改为 LEFT JOIN 会如何影响查询的性能?性能会有变化吗?是的,会不会太多了?取决于行数是的。 因此,仅当您确实需要该数据时才使用它!

    【讨论】:

    • 如果我不使用 DefaultIfEmpty 或不使用 Title = x.Title ?? "" ,当我获取查询到列表时,它会返回错误,因为数据不能为空
    • 您是先使用代码吗?如果是这样,您可以将外键添加为可为空,例如:public int? parentRefNo {get;set;}
    • Title 属性是字符串,默认为空,当我尝试在泛型方法中使用它时,我得到空引用错误。我在 c#8 中找到了一个可以为空的解决方案,也许它可以帮助我
    • 字符串默认是可空的,你可以设置一个字符串为空,但你不能将一个int值设置为空,除非你将它定义为可空的int,这已完成-> int?道具名称; int 上的问号表明它可以为空,或者您可以将其用作 public Nullable test { get;放; }
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多