从项目中学到Linq预编译的一点知识

Posted on 2011-08-31 19:26  Wilson_Lin  阅读(244)  评论(0)    收藏  举报

public GiftParameters Parameter { get; set; }

        public IQueryable<Gift> Query(SNSEntities ent)
        {
            if (Parameter == null)
            {
                //全搜索
                return QueryAllGifts(ent);
            }
            else
            {
                //列出无创建人查询条件的礼物
                return QueryGiftByParameter(ent, Parameter);
            }
        }

        /// <summary>
        /// 搜索状态为不被删除的礼物
        /// </summary>
        private static Func<SNSEntities, IQueryable<Gift>> QueryAllGifts = CompiledQuery.Compile((SNSEntities ent) => (from g

in ent.Gift
                                                                                                                        

select g));
        /// <summary>
        /// 搜索对应查询条件的礼物
        /// </summary>
        private static Func<SNSEntities, GiftParameters, IQueryable<Gift>> QueryGiftByParameter = CompiledQuery.Compile

((SNSEntities ent, GiftParameters parameter) => (
            from g in ent.Gift
            where (!parameter.GiftStatus.HasValue || g.Status == parameter.GiftStatus)
            && (string.IsNullOrEmpty(parameter.GiftName) || g.Name.Contains(parameter.GiftName))
            && (!parameter.ValidityStart.HasValue || g.ValidBeginTime <= parameter.ValidityStart)
            && (!parameter.ValidityEnd.HasValue || g.ValidEndTime >= parameter.ValidityEnd)
            && (!parameter.GiftType.HasValue || g.Type == parameter.GiftType)
            select g
            ));

linq预编译的好处是可以提升性能,但牺牲的是灵活性,在选择性能还是灵活性上需要考虑
上面的程序需要留意这几句,一个很巧妙的机制:

(string.IsNullOrEmpty(parameter.GiftName) ||g.Name.Contains(parameter.GiftName))
&& (!parameter.ValidityStart.HasValue || g.ValidBeginTime <= parameter.ValidityStart)

目的为判断是否有前面的这个查询条件,因为“||”必须为真,如果ValidityStart有值,(parameter是一个查询参数类)

则!parameter.ValidityStart.HasValue为假,则后面的条件需要执行(即有值就查询),如果ValidityStart没值,

则!parameter.ValidityStart.HasValue为真,则后面的条件不执行(即无值就不查询)(做多条件查询的时候很有用)

博客园  ©  2004-2026
浙公网安备 33010602011771号 浙ICP备2021040463号-3