Asp.net Linq到数据集,查询优化

Asp.net Linq到数据集,查询优化,asp.net,sql-server,entity-framework,linq-to-dataset,Asp.net,Sql Server,Entity Framework,Linq To Dataset,我有以下linq问题: var itembind = (from q in dsSerach.Tables[0].AsEnumerable() select new { PatternID = q.Field<int>("PatternID"), PatternName = q.Fie

我有以下linq问题:

var itembind = (from q in dsSerach.Tables[0].AsEnumerable()
            select new
                           {
                               PatternID = q.Field<int>("PatternID"),
                               PatternName = q.Field<string>("PatternName") + " " + q.Field<string>("ColorID") + q.Field<string>("BookID"),
                               ColorID = q.Field<string>("ColorID"),
                               BookID = q.Field<string>("BookID"),
                               CoverImage = (from img1 in objJFEntities.ProductImages.ToList()
                                             where img1.PatternName.ToLower() == q.Field<string>("PatternName").ToLower()
                                             select new CoverImage
                                             {
                                                 URL = "Images/MediumPatternImages/" +
                                                     q.Field<string>("PatternName") + "_" + q.Field<string>("ColorID") + q.Field<string>("BookID") + q.Field<string>("ImageExtension"),
                                                 ID = q.Field<int>("ProductImageID")
                                             }).FirstOrDefault(),
                               TotalCount = q.Field<int>("TotalCount")
                           }).Distinct();



var patterns = (from r in itembind
            group r by new { r.PatternID, r.ColorID } into g
            select new SearchPattern
            {
                PatternID = g.Key.PatternID,
                PatternName = string.Join(",", g.OrderBy(s => s.ColorID).OrderBy(s => s.BookID)
                                          .Select(s => String.Format("<a href='{0:s}' title='{1:s}'>{2:s}</a><br />",
                                                     new object[] { String.Format("Product.aspx?ID={0}&img={1}", g.Key.PatternID, s.CoverImage.ID), s.PatternName, s.PatternName })).FirstOrDefault()),
                CoverImage = g.Count() > 1 ? (from img1 in objJFEntities.ProductImages.ToList()
                                              where img1.ProductImageID == g.Select(i => i.CoverImage.ID).FirstOrDefault() && img1.ColorID.ToString() == g.Key.ColorID

                                              select new CoverImage
                                              {
                                                  URL = "Images/MediumPatternImages/" +
                                                      img1.PatternName + "_" + img1.ColorID + img1.BookID + img1.ImageExtension,
                                                  ID = img1.ProductImageID
                                              }).FirstOrDefault() : g.Select(i => i.CoverImage).FirstOrDefault()


            }).ToList();
var itembind=(来自dsSerach.Tables[0]中的q.AsEnumerable()
选择新的
{
PatternID=q.字段(“PatternID”),
PatternName=q.Field(“PatternName”)+“”+q.Field(“ColorID”)+q.Field(“BookID”),
ColorID=q.Field(“ColorID”),
BookID=q.字段(“BookID”),
CoverImage=(来自objjfenties.ProductImages.ToList()中的img1)
其中img1.PatternName.ToLower()==q.Field(“PatternName”).ToLower()
选择新封面图片
{
URL=“Images/MediumPatternImages/”+
q、 字段(“PatternName”)+“”+q.Field(“ColorID”)+q.Field(“BookID”)+q.Field(“ImageExtension”),
ID=q.Field(“ProductImageID”)
}).FirstOrDefault(),
TotalCount=q.字段(“TotalCount”)
}).Distinct();
var patterns=(来自itembind中的r)
将r按新的{r.PatternID,r.ColorID}分组到g中
选择新的搜索模式
{
PatternID=g.Key.PatternID,
PatternName=string.Join(“,”,g.OrderBy(s=>s.ColorID).OrderBy(s=>s.BookID)
.Select(s=>String.Format(“
”), 新对象[]{String.Format(“Product.aspx?ID={0}&img={1}”、g.Key.PatternID、s.CoverImage.ID)、s.PatternName、s.PatternName})).FirstOrDefault(), CoverImage=g.Count()>1?(来自objJFEntities.ProductImages.ToList()中的img1) 其中img1.ProductImageID==g.Select(i=>i.CoverImage.ID).FirstOrDefault()&&img1.ColorID.ToString()==g.Key.ColorID 选择新封面图片 { URL=“Images/MediumPatternImages/”+ img1.PatternName+“”+img1.ColorID+img1.BookID+img1.ImageExtension, ID=img1.ProductImageID }).FirstOrDefault():g.Select(i=>i.CoverImage).FirstOrDefault() }).ToList();
仅对1000条记录执行这些查询需要1分钟以上的时间。 dsSearch是一个数据集,其中填充了从SQL中的过程返回的记录。 我使用实体框架。该站点部署了IIS7.0。SQL server 2008正在使用中

我收到“错误消息:超时已过期。操作完成前超时时间已过,或者服务器没有响应。”, 无法打开登录请求的数据库“DB”。登录失败。“&”基础提供程序在打开时失败。这类错误非常常见于站点

请告诉我如何优化这样的查询

编辑:

这是程序


在第一个查询中,您正在执行objjfenties.ProductImages.ToList(),使用ToList()调用从数据库中获取每个条目,然后在内存中过滤结果

Rolfvm正确地指出,
objjfenties.ProductImages
导致了问题,但分析有点不同。当枚举时,每次迭代查询都会将整个
ProductImages
表提取到内存中。因此,一种优化方法是首先获取集合中的图像,然后在查询语句中使用该集合

var localImages=objjfenties.ProductImages.ToList();
...
封面图像=(来自本地图像中的img1…)。。。。

但是,您的查询似乎做得太多了。您构建了第一部分
itembind
,而没有执行它。然后构建了第二部分(
var patterns=(来自itembind
)并通过
ToList()执行它
。但在第二部分中,您从未使用第一部分中的
封面图像。因此创建这些图像是浪费资源。(或者您浏览了代码,隐藏了第一部分的另一个用途).

您确认了连接字符串是否正确吗?是否使用集成安全性?是的,我已对此进行了验证。我没有在连接字符串中使用集成安全性错误肯定表明是连接到数据库超时,而不是查询超时(我认为默认超时为60秒)。我会检查连接和您的IIS设置。但这种情况并不总是发生。有时3000条记录也会这样。您能简化一下吗?我很难看到您访问数据库的位置。LINQ to DATASE仅对内存中的数据进行查询。我在删除ToList()后尝试了.Query在此之后将不会给出任何输出。但是到sql的映射可能不支持ToLower()操作(不确定您使用的是哪个数据库)。因此,这取决于您使用的数据库压缩。要了解您的查询没有返回任何结果的原因,最好的方法是使用sql management StudioHanks附带的sql profiler,将集合推到单独的工作中&现在需要上一次的1/4。我理解其中的差异,非常感谢。请验证我的过程也是&如果可以优化,请给我建议。正如我所说的,我想知道为什么要创建
CoverImage
对象。而且你可以尝试只获取你需要的
ProductImages
。coverimages用于模式查询&以及我的UI中的结果