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为真,则后面的条件不执行(即无值就不查询)(做多条件查询的时候很有用)
浙公网安备 33010602011771号