如何编写动态Linq2Sql编译查询?

时间:2009-06-19 15:30:13

标签: performance linq-to-sql

与原始ADO.NET相比,我遇到了Linq2Sql的性能问题,导致我走上了编译查询的道路。到目前为止,我已经走到这一步了

public static readonly Func<MyDataContext, WebServices.Search.Parameters, IQueryable<image>>
    Compiled_SelectImagesLinq = 
        CompiledQuery.Compile<MyDataContext, WebServices.Search.Parameters, IQueryable<image>>(
            (dc, parameters) =>  from i in dc.images
                  join l in dc.links on i.image_id equals l.image_id
                  join r in dc.resolutions on i.image_id equals r.image_id
                  where i.image_enabled == true && i.image_rating >= parameters.MinRating
                  && i.image_rating <= parameters.MaxRating
                  select i
      );

但是,我无法弄清楚如何将额外的可选参数添加到查询中,正如我目前所做的那样

if (parameters.Country != null)
{
    query = query.Where(x => x.image_country_id == parameters.Country);
}

if (parameters.ComponentId != null)
{
    query = query.Where(x => x.links.Any(l => l.link_component_id == parameters.ComponentId));
}

等等

我尝试写另一个功能

var query = Compiled_SelectImagesLinq(parameters);

然后将额外参数添加到查询并返回

return query.Distinct().Take(parameters.Results);

这看起来不对,并且没有结果

2 个答案:

答案 0 :(得分:0)

看看这篇文章。它可能无法满足你的需求(特别是因为你正在编译你的查询),但是当有人在同一个句子中提到Dynamic和Linq时,我将它们引用到这篇文章中:

动态LINQ:使用LINQ动态查询库

http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx

答案 1 :(得分:0)

您必须对特定查询进行基准测试,但在编译查询性能改进等于开销之前,查询通常必须使用10-20次。另外,如何在where子句中添加参数?

此外,动态编译查询似乎有点不匹配。动态LINQ查询库将满足您的需求,但我认为您不会获得所需的编译查询性能提升。