2013-01-04 2 views
3

하나의 Linq 쿼리가 있습니다. 쿼리를 실행하면 10 초 동안 만 모델에 데이터를 추출하는 데 13 초가 걸립니다. 내가 쓴 쿼리가 성능에 좋은지 아닌지를 알아야합니다. 내가 뭘 잘못하고 있는지 안내해 줘. 이 외부 LINQ 문의 모든 항목에 대해 3 내부 LINQ 문을 실행하기 때문에더 나은 방법으로이 LINQ 쿼리를 작성하는 방법

코드

var stocktakelist = (from a in Db.Stocktakes 
          select new ExportStock 
           { 
            Id = a.Id, 
            ItemNo = a.ItemNo, 
            AdminId = (from admin in Db.AdminAccounts where admin.Id == a.Id select admin.Name).FirstOrDefault(), 
            CreatedOn = a.CreatedOn, 
            Status = (from items in Db.Items where items.ItemNo == a.ItemNo select items.ItemStatu.Description).FirstOrDefault(), 
            Title = (from tit in Db.BibContents where tit.BibId == (from bibs in Db.Items where bibs.ItemNo == a.ItemNo select bibs.BibId).FirstOrDefault() && tit.TagNo == "245" && tit.Sfld == "a" select tit.Value).FirstOrDefault() // This line of Query only makes the performance Issue 
           } 
      ).ToList(); 

감사

+2

나는 당신이 어떤 조인 필요가 있다고 생각합니다. 봐 [여기] (http://msdn.microsoft.com/en-us/vstudio/bb737929) 및 [여기] (http://stackoverflow.com/a/4115353/106866). 또한 DB.Stocktakes가 IQueryable인지 확인하십시오. 나는 IQueryables가 IEnumerables보다 빠르다는 것을 발견했다. 왜냐하면 IQueryables가 모든 데이터를 먼저 검색하는 대신에 데이터베이스에서 많은 작업을 수행하고 그로부터 몇 가지 트릭을 수행하기 때문이다. – jao

+2

자오가 말했듯이 조인은 이동하는 방법입니다 (객체에 네비게이션 속성이없는 경우). 또한, 데이터베이스의'Items.ItemNo' 등등에 대한 인덱스를 가지고 있는지 확인하십시오. – Alex

+0

먼저 SQL 쿼리를 작성하여 원하는 데이터를 얻은 다음 LINQ 쿼리로 작성하는 데 도움이 될 수 있습니다. LINQ 쿼리를 작성하는 데 어려움이있을 때이 작업을 수행합니다. – Thelonias

답변

1

. 나는 그것을 테스트 할 수 없다. 나는 100 % 확신하지 못한다.이 쿼리는 결과를 얻을 것이다. 당신은 적어도 어쩌면 적어도 당신에게 쓸 방법에 대한 힌트를 줄 것이다. linq와 조인한다.

from a in Db.Stocktakes 

join admin in Db.AdminAccounts 
    on a.Id equals admin.Id 
into adminJoinData 
from adminJoinRecord in adminJoinData.DefaultIfEmpty() 

join items in Db.Items 
    on a.ItemNo equals items.ItemNo 
into itemsJoinData 
from itemsJoinRecord in itemsJoinData.DefaultIfEmpty() 

join title in Db.BibContents 
    (
     from subQuery in Db.BibContents 
     where subQuery.TagNo == "245" 
     where subQuery.Sfld == "a" 
     select subquery 
    ) 
    on title.BibId equals itemsJoinRecord.BidId 
into titleJoinData 
from titleJoinRecord in titleJoinData.DefaultIfEmpty() 

select new ExportStock() 
{ 
    Id = a.Id, 
    ItemNo = a.ItemNo, 
    AdminId = adminJoinRecord.Name, 
    CreatedOn = a.CreatedOn, 
    Status = itemsJoinRecord.ImemStatu.Description, 
    Title = titleJoinRecord.Value 
} 
+0

코딩 방법을 시도했습니다. 잘 작동합니다. 답장을 보내 주셔서 감사합니다. – Dheyv

2

이 너무 느린 이유는. LINQ 조인을 사용하면 쿼리가 4 개만 실행되어 함께 연결되므로 더 빠릅니다.

가입 방법을 찾으려면 사용중인 LINQ 유형에 따라 인터넷 리소스가 충분해야합니다.

SQL 서버에서이 데이터를 가져 오는 경우 SQL에서 집중적 인 작업을 수행하는 것이 좋습니다. SQL이 설계되었으며 .NET보다 훨씬 빠릅니다. 편집 : 아래와 같이 강조 표시된대로 은 LINQ to SQL/Entities를 사용하고 올바른 조인 구문을 사용하는 경우 SQL에서 수행되는입니다.

+1

OP가 조인을 올바르게 사용하면 "집중적 인 작업"이 SQL에서 수행됩니다. – Rawling

+0

OP가 LINQ to SQL/Entities (또는 other?)를 사용한다고 가정합니다. 그러나 원시 LINQ를 사용하면 SQL에서 데이터를 자동으로 가져올 수 없습니다. – jaypeagi

+0

@Rawling 업데이트 된 게시물 – jaypeagi

1

다른 사람들이 말한 것처럼 SQL에서 쓰는 것처럼 LINQ에서 Left Outer Joins을 사용해야합니다.

귀하의 질의는 위의 (이 안된이지만, 기본적인 아이디어를 제공합니다) 대략이 한 번에 변환처럼 보이는 끝날 것이다 : 나는 몇 가지 연습 조인에 해당 쿼리를 만들려고

var a = from a in Db.Stocktakes 
    join admin in Db.AdminAccounts on admin.Id equals a.Id into tmpAdmin 
    from ad in tmpAdmin.DefaultIfEmpty() 
    join item in Db.Items on item.ItemNo equals a.ItemNo into tmpItem 

    from it in tmpItem.DefaultIfEmpty() 
    join title in Db.BibContents on bib.BibId equals items.BibId into tmpTitle 

    from ti in tmpTitle.DefaultIfEmpty() 
    where ti.TagNo == "245" 
     && ti.Sfld == "a" 
    select new ExportStock 
    { 
     Id = a.Id, 
     ItemNo = a.ItemNo, 
     AdminId = ad == null ? default(int?) : ad.Id, 
     CreatedOn = a.CreatedOn, 
     Status = it == null ? default(string) : it.ItemStatus.Description, 
     Title = ti == null ? default(string) : ti.Value 
    }; 
0

람다를 사용하면 쿼리가 다음과 같이 표시됩니다 연산 식 :

 Db.Stocktakes 
      .Join(Db.AdminAccounts, a => a.Id, b => b.Id, (a,b) => new { a, AdminId = b.Name }) 
      .Join(Db.Items, a => a.ItemNo, b => b.ItemNo, (a,b) => new { a, Status = b.ItemStatus.Description, BidId = b.BibId }) 
      .Join(Db.BibContents, a => a.BibId, b => b.BibId, (a,b) => new { a, Value = b.Value, TagNo = b.TagNo, Sfld = b.Sfld }) 
      .Where(a => a.TagNo == "245" && a.Sfld == "a") 
      .Select(a => 
       new ExportStock { Id = a.Id, 
            ItemNo = a.ItemNo, 
            AdminId = a.AdminId, 
            CreatedOn = a.CreatedOn, 
            Status = a.Status, 
            Title = a.Value 
       } 
      ).ToList(); 
관련 문제