【问题标题】:How to prevent a condition from being repeated in several navigation properties in lambda expressions or linq如何防止条件在 lambda 表达式或 linq 的多个导航属性中重复
【发布时间】:2017-07-04 13:02:17
【问题描述】:

当我将数据库实体映射到项目中的 DTO 时,我会在单个模型中创建标题及其相关语言表的属性。 当在几个属性中重复这个条件时,生成的查询非常大,让我在查询中浪费了很多时间。我怎样才能提出这个只做一次比较?

return s => new DtoTimelineEvent()
        {
            Id = s.tline_even_id_i,
            TimelineId = s.tline_id_i,
            Tipo = (TimeLineEventTypes)s.even_tip_id_i,
            Fecha = s.fecha_dt,

            Titulo = s.t_tline_even_rel_idi.Any(a => a.idi_id_t == (byte)cultura) ? s.t_tline_even_rel_idi.FirstOrDefault(a => a.idi_id_t == (byte)cultura).Titulo : s.t_tline_even_rel_idi.FirstOrDefault().Titulo,
            Descripcion = s.t_tline_even_rel_idi.Any(a => a.idi_id_t == (byte)cultura) ? s.t_tline_even_rel_idi.FirstOrDefault(a => a.idi_id_t == (byte)cultura).Descripcion : s.t_tline_even_rel_idi.FirstOrDefault().Descripcion,

            SocialId = s.t_tline_even_rel_idi.Any(a => a.idi_id_t == (byte)cultura) ?
               s.t_tline_even_rel_idi.FirstOrDefault(a => a.idi_id_t == (byte)cultura).obj_id :
               s.t_tline_even_rel_idi.FirstOrDefault().obj_id,
        }

“Titulo”、“Description”和“SocialId”具有相同的条件,并且在更多字段中重复,如何改进此查询?

【问题讨论】:

    标签: c# .net entity-framework linq lambda


    【解决方案1】:

    分两步进行:首先,获取定义了TituloDescriptionSocialId的对象,然后将它们投影出来:

    return s => {
        var common = s.t_tline_even_rel_idi.Any(a => a.idi_id_t == (byte)cultura)
            ? s.t_tline_even_rel_idi.FirstOrDefault(a => a.idi_id_t == (byte)cultura)
            : s.t_tline_even_rel_idi.FirstOrDefault();
        return new DtoTimelineEvent() {
            Id = s.tline_even_id_i,
            TimelineId = s.tline_id_i,
            Tipo = (TimeLineEventTypes)s.even_tip_id_i,
            Fecha = s.fecha_dt,
            Titolo = common.Titolo,
            Description = common.Description,
            SocialId = common.obj_id
        };
    };
    

    这只会获取一次common对象,然后在DTO的构造函数中引用它的字段。

    【讨论】:

    • 我的问题是这个函数在一个Queryable.Select()里面,所以我还没有去DB,它正在构建一个Query。如果我使用您的解决方案,它将在每次迭代中调用 DB
    • 我需要一个不涉及调用数据库的解决方案,除非我愿意。还是谢谢
    • @Jorge 我认为返回值在更大的 LINQ 查询中。不过,您可以将其推送到同一个 lambda 中。
    猜你喜欢
    • 2016-04-18
    • 1970-01-01
    • 2010-12-28
    • 2018-08-09
    • 1970-01-01
    • 2018-08-22
    • 1970-01-01
    • 1970-01-01
    • 2016-07-01
    相关资源
    最近更新 更多