2009-12-11 5 views
0

나는 저장 프로 시저가 있고 그것을 LLBLGen 쿼리에 Linq로 변환하려고합니다. Linq에서 LLBGen에 대한 쿼리가 작동하지만 SQL Server에 보내는 쿼리를 추적하면 완벽하지 않습니다. Linq to LLBLGen 쿼리 문제

는 저장 프로 시저입니다 :

using System.Linq.Dynamic; 

     var q = (
        from up in MetaData.UmbracoProduct 
        join p in MetaData.Product on up.UmbracoProductId equals p.UmbracoProductId 
        where up.ProductCode.Contains(searchText) || 
         up.ProductName.Contains(searchText) || 
         p.Code.Contains(searchText) || 
         p.Description.Contains(searchText) || 
         p.DescriptionLong.Contains(searchText) || 
         p.UnitCode.Contains(searchText) 
        select new UmbracoProductOverview 
        { 
         UmbracoProductId = up.UmbracoProductId, 
         ProductName = up.ProductName, 
         ProductCode = up.ProductCode 
        } 
       ).OrderBy(sortExpression); 

//Save the count in HttpContext.Current.Items. This value will only be saved during 1 single HTTP request. 
HttpContext.Current.Items["AllProductsCount"] = q.Count(); 

//Returns the results paged. 
return q.Skip(startRowIndex).Take(maximumRows).ToList<UmbracoProductOverview>(); 

이 프로세스 내 초기 표현된다 : 이것은 지금

value(SD.LLBLGen.Pro.LinqSupportClasses.DataSource`1[Eurofysica.DB.EntityClasses.UmbracoProductEntity]).Join(value(SD.LLBLGen.Pro.LinqSupportClasses.DataSource`1[Eurofysica.DB.EntityClasses.ProductEntity]), up => up.UmbracoProductId, p => p.UmbracoProductId, (up, p) => new <>f__AnonymousType0`2(up = up, p = p)).Where(<>h__TransparentIdentifier0 => (((((<>h__TransparentIdentifier0.up.ProductCode.Contains(value(Eurofysica.BusinessLogic.BLL.Controllers.UmbracoProductController+<>c__DisplayClass1).searchText) || <>h__TransparentIdentifier0.up.ProductName.Contains(value(Eurofysica.BusinessLogic.BLL.Controllers.UmbracoProductController+<>c__DisplayClass1).searchText)) || <>h__TransparentIdentifier0.p.Code.Contains(value(Eurofysica.BusinessLogic.BLL.Controllers.UmbracoProductController+<>c__DisplayClass1).searchText)) || <>h__TransparentIdentifier0.p.Description.Contains(value(Eurofysica.BusinessLogic.BLL.Controllers.UmbracoProductController+<>c__DisplayClass1).searchText)) || <>h__TransparentIdentifier0.p.DescriptionLong.Contains(value(Eurofysica.BusinessLogic.BLL.Controllers.UmbracoProductController+<>c__DisplayClass1).searchText)) || <>h__TransparentIdentifier0.p.UnitCode.Contains(value(Eurofysica.BusinessLogic.BLL.Controllers.UmbracoProductController+<>c__DisplayClass1).searchText))).Select(<>h__TransparentIdentifier0 => new UmbracoProductOverview() {UmbracoProductId = <>h__TransparentIdentifier0.up.UmbracoProductId, ProductName = <>h__TransparentIdentifier0.up.ProductName, ProductCode = <>h__TransparentIdentifier0.up.ProductCode}).OrderBy(=> .ProductName).Count() 

이 LLBLGen 쿼리 내 Linq에있다

ALTER PROCEDURE [dbo].[spDIGI_GetAllUmbracoProducts] 
-- Add the parameters for the stored procedure. 
@searchText nvarchar(255), 
@startRowIndex int, 
@maximumRows int, 
@sortExpression nvarchar(255) AS BEGIN 

SET @startRowIndex = @startRowIndex + 1 
SET @searchText = '%' + @searchText + '%' 

-- SET NOCOUNT ON added to prevent extra result sets from 
-- interfering with SELECT statements. 
SET NOCOUNT ON; 

-- This is the query which will fetch all the UmbracoProducts. 
-- This query also supports paging and sorting. 
WITH UmbracoOverview As 
(
    SELECT  ROW_NUMBER() OVER(
     ORDER BY 
     CASE 
      WHEN @sortExpression = 'productName' THEN umbracoProduct.productName 
      WHEN @sortExpression = 'productCode' THEN umbracoProduct.productCode    
     END ASC, 
     CASE 
      WHEN @sortExpression = 'productName DESC' THEN umbracoProduct.productName 
      WHEN @sortExpression = 'productCode DESC' THEN umbracoProduct.productCode   
     END DESC) 
     AS row_num, umbracoProduct.umbracoProductId, umbracoProduct.productName, umbracoProduct.productCode 
    FROM   umbracoProduct INNER JOIN 
        product ON umbracoProduct.umbracoProductId = product.umbracoProductId 
    WHERE  (umbracoProduct.productName LIKE @searchText 
    OR   umbracoProduct.productCode LIKE @searchText 
    OR   product.code LIKE @searchText 
    OR   product.description LIKE @searchText 
    OR   product.descriptionLong LIKE @searchText 
    OR   product.unitCode LIKE @searchText) 
) 

SELECT  UmbracoOverview.UmbracoProductId, UmbracoOverview.productName, UmbracoOverview.productCode 
FROM  UmbracoOverview 
WHERE  (row_num >= @startRowIndex 
AND   row_num < (@startRowIndex + @maximumRows)) 


-- This query will count all the UmbracoProducts. 
-- This query is used for paging inside ASP.NET. 
SELECT  COUNT (umbracoProduct.umbracoProductId) AS CountNumber 
FROM  umbracoProduct INNER JOIN 
       product ON umbracoProduct.umbracoProductId = product.umbracoProductId 
WHERE  (umbracoProduct.productName LIKE @searchText 
OR   umbracoProduct.productCode LIKE @searchText 
OR   product.code LIKE @searchText 
OR   product.description LIKE @searchText 
OR   product.descriptionLong LIKE @searchText 
OR   product.unitCode LIKE @searchText) END 

쿼리가 SQL Server에 보내는 것처럼 보이는 모습 :

선택 쿼리 :

Query: SELECT [LPA_L2].[umbracoProductId] AS [UmbracoProductId], [LPA_L2].[productName] AS [ProductName], [LPA_L2].[productCode] AS [ProductCode] FROM ([eurofysica].[dbo].[umbracoProduct] [LPA_L2] INNER JOIN [eurofysica].[dbo].[product] [LPA_L3] ON [LPA_L2].[umbracoProductId] = [LPA_L3].[umbracoProductId]) WHERE (((((((([LPA_L2].[productCode] LIKE @ProductCode1) OR ([LPA_L2].[productName] LIKE @ProductName2)) OR ([LPA_L3].[code] LIKE @Code3)) OR ([LPA_L3].[description] LIKE @Description4)) OR ([LPA_L3].[descriptionLong] LIKE @DescriptionLong5)) OR ([LPA_L3].[unitCode] LIKE @UnitCode6)))) 

매개 변수 : ProductCode1 @ : 문자열. 길이 : 2. 정밀도 : 0. 스케일 : 0. 방향 : 입력. 값 : "%%". 매개 변수 : @ ProductName2 : 문자열. 길이 : 2. 정밀도 : 0. 스케일 : 0. 방향 : 입력. 값 : "%%". 매개 변수 : @ Code3 : String. 길이 : 2. 정밀도 : 0. 스케일 : 0. 방향 : 입력. 값 : "%%". 매개 변수 : @ Description4 : 문자열. 길이 : 2. 정밀도 : 0. 스케일 : 0. 방향 : 입력. 값 : "%%". 매개 변수 : @ DescriptionLong5 : 문자열. 길이 : 2. 정밀도 : 0. 스케일 : 0. 방향 : 입력. 값 : "%%". 매개 변수 : @ UnitCode6 : 문자열입니다. 길이 : 2. 정밀도 : 0. 스케일 : 0. 방향 : 입력. 값 : "%%".

카운트 쿼리

Query: SELECT TOP 1 COUNT(*) AS [LPAV_] FROM (SELECT [LPA_L2].[umbracoProductId] AS [UmbracoProductId], [LPA_L2].[productName] AS [ProductName], [LPA_L2].[productCode] AS [ProductCode] FROM ([eurofysica].[dbo].[umbracoProduct] [LPA_L2] INNER JOIN [eurofysica].[dbo].[product] [LPA_L3] ON [LPA_L2].[umbracoProductId] = [LPA_L3].[umbracoProductId]) WHERE (((((((([LPA_L2].[productCode] LIKE @ProductCode1) OR ([LPA_L2].[productName] LIKE @ProductName2)) OR ([LPA_L3].[code] LIKE @Code3)) OR ([LPA_L3].[description] LIKE @Description4)) OR ([LPA_L3].[descriptionLong] LIKE @DescriptionLong5)) OR ([LPA_L3].[unitCode] LIKE @UnitCode6))))) [LPA_L1] 

매개 변수 : ProductCode1 @ : 문자열. 길이 : 2. 정밀도 : 0. 스케일 : 0. 방향 : 입력. 값 : "%%". 매개 변수 : @ ProductName2 : 문자열. 길이 : 2. 정밀도 : 0. 스케일 : 0. 방향 : 입력. 값 : "%%". 매개 변수 : @ Code3 : String. 길이 : 2. 정밀도 : 0. 스케일 : 0. 방향 : 입력. 값 : "%%". 매개 변수 : @ Description4 : 문자열. 길이 : 2. 정밀도 : 0. 스케일 : 0. 방향 : 입력. 값 : "%%". 매개 변수 : @ DescriptionLong5 : 문자열. 길이 : 2. 정밀도 : 0. 스케일 : 0. 방향 : 입력. 값 : "%%". 매개 변수 : @ UnitCode6 : 문자열입니다. 길이 : 2. 정밀도 : 0. 스케일 : 0. 방향 : 입력. 값 : "%%".

위에서 볼 수 있듯이 (내 저장 프로 시저와 같이) 정렬이나 페이징이 수행되지 않습니다. 이것은 모든 결과를 가져온 후에 코드 내에서 수행됩니다. 이것은 많은 비용이 든다! 아무도 내가 LLTLGen 적절한 방법으로 Linq 내 저장 프로 시저를 변환 할 수있는 방법을 알고 있습니까?

답변

0

Skip/Take 대신 TakePage()를 사용해 보셨습니까? 문서는 이것이 선호되고 Skip/Take와 함께 이상한 문제가 발생했다고 말합니다.

OrderBy 절이 return 문에서 더 나을 것이라고 생각하십니까? 문제의 근원이 그것이 의심 스럽다.

그래서 아마 시도 :

return q.OrderBy(sortExpression).TakePage(pageNumber, pageSize);