2010-05-06 3 views
2

"CodeLookupAccessDataContext"라는 Visual Studio LINQ to SQL 클래스 마법사를 통해 생성 된 DataContext 개체가 있습니다. 이 개체의 기능을 확장하여 LINQ 결과를 SQL 쿼리에 반환하는 일부 메서드를 제공합니다. 저는 여기에 정의 된 방법은 다음과 같습니다LINQ에서 SQL로 생성 된 T-SQL에 where 절이 누락되었습니다.

public List<CompositeSIDMap> lookupCompositeSIDMap(int regionId, int marketId) 
{ 
    var sidGroupId = CompositeSIDGroupMaps.Where(x => x.RegionID.Equals(regionId) && x.MarketID.Equals(marketId)) 
     .Select(x => x.CompositeSIDGroup); 

    IEnumerator<int> sidGroupIdEnum = sidGroupId.GetEnumerator(); 

    if (sidGroupIdEnum.MoveNext()) 
     return lookupCodeInfo<CompositeSIDMap, CompositeSIDMap>(x => x.CompositeSIDGroup.Equals(sidGroupIdEnum.Current), x => x); 
    else 
     return null; 
} 

private List<TResult> lookupCodeInfo<T, TResult>(Func<T, bool> compLambda, Func<T, TResult> selectLambda) 
    where T : class 
{ 
    System.Data.Linq.Table<T> dataTable = this.GetTable<T>(); 

    var codeQueryResult = dataTable.Where(compLambda) 
     .Select(selectLambda); 

    List<TResult> codeList = new List<TResult>(); 
    foreach (TResult row in codeQueryResult) 
     codeList.Add(row); 

    return codeList; 
} 

CompositeSIDGroupMap 및 CompositeSIDMap 내의 DataContext 개체에서 개체로 표시됩니다 우리의 데이타베이스는 모두 테이블입니다. 나는이 방법을 호출 한 후 T-SQL 생성이 메소드를 호출하고 표시하려면 다음 코드를 작성 :

using (CodeLookupAccessDataContext codeLookup = new CodeLookupAccessDataContext()) 
{ 
    codeLookup.Log = Console.Out; 
    List<CompositeSIDMap> compList = codeLookup.lookupCompositeSIDMap(regionId, marketId); 
} 

을 내가 가지고이 코드를 호출 한 후 내 로그에 다음과 같은 결과 :

SELECT [t0].[CompositeSIDGroup] 
FROM [dbo].[CompositeSIDGroupMap] AS [t0] 
WHERE ([t0].[RegionID] = @p0) AND ([t0].[MarketID] = @p1) 
-- @p0: Input Int (Size = 0; Prec = 0; Scale = 0) [5] 
-- @p1: Input Int (Size = 0; Prec = 0; Scale = 0) [3] 
-- Context: SqlProvider(Sql2005) Model: AttributedMetaModel Build: 3.5.30729.1 

SELECT [t0].[PK_CSM], [t0].[CompositeSIDGroup], [t0].[InputSID], [t0].[TargetSID], [t0].[StartOffset], [t0].[EndOffset], [t0].[Scale] 
FROM [dbo].[CompositeSIDMap] AS [t0] 
-- Context: SqlProvider(Sql2005) Model: AttributedMetaModel Build: 3.5.30729.1 

첫 번째를 T-SQL 문은 지정된대로 where 절을 포함하며 예상대로 하나의 열을 반환합니다. 그러나 두 번째 명령문에서는 where 절이 누락되어보고 싶은 행과 관심있는 열을 지정했지만 모든 열을 반환합니다. 두 번째 T-SQL 문은 그대로 생성되는 이유는 무엇이며 T-SQL을 통해 사양에 따라 데이터를 필터링 할 수 있도록해야합니까?

lookupCodeInfo()를 유지하는 것이 좋으며 특히 반환 할 행/열을 지정하는 람다 함수를 허용하도록 유지하는 데 관심이 있습니다.

UPDATE는

This discussion도 관심이있을 수 있습니다. 기능

private List<TResult> lookupCodeInfo<T, TResult>(Func<T, bool> compLambda, 
               Func<T, TResult> selectLambda) 

함수로 컴파일 된 람다를 만들 것입니다 Func<...> 인수를 받아들이는

답변

5

문제입니다. Linq-to-SQL SQL 생성기는 컴파일 된 함수를 SQL로 변환 할 수는 없지만 메모리에서 필터링과 프로젝션을 수행합니다.

lookupCodeInfoExpression<...>으로 변경하면 linq-to-SQL이 통과 할 수있는 표현 트리로 유지됩니다.

+3

더 중요한 점은 LINQ-to-SQL *이이를 수행하도록 요청되지 않습니다. 'Func <>'을 주면'Queryable.Where'가 아닌'Enumerable.Where'를 사용하고 LINQ-to-Objects로 전환합니다. 그래서 그것은 단지 "그럴 수 없다"는 것입니다 (비록 당신이 옳다하더라도 그것은 불가능합니다). –

+0

도움이되는 팁과 특히 무슨 일이 일어나고 있는지에 대한 설명을 해주셔서 감사합니다. 에 대한). LINQ to Objects를 사용하면 표현식을 컴파일해야했습니다. 나는 LINQ to SQL에 동일하게 적용된 것으로 가정했는데, 이는 혼란을 설명합니다. –

관련 문제