2012-03-20 5 views
1

LINQ 람다 내부에 메서드를 배치해야합니다. 기본적으로이 코드는 productName를 포함하는 모든 shoppingCart 인스턴스를 선택하는 데 사용됩니다LINQ 람다 확장 메서드 내부에 메서드를 삽입하는 방법

string productName = "Some product"; 

searchShoppingCart = shoppingCart.Where(m => productName.Equals(_ProductRepository.GetProductName(m.Id))); 

: 나는 다음과 같은 코드가 있습니다.

string GetProductName(int shoppingCartId) 메서드는 _ProductRepository에서 하나의 제품 이름을 반환하는 메서드입니다. 이 방법이 구현되고 논리가 중요하지 않습니다.

LINQ가 예외를 throw하는 것이 문제입니다. 이 예외가 발생하는 이유를 알고 있습니다. 해결 방법을 알고 싶습니다. 시도 :

var productContained = shoppingCart.Select(sc => new 
        { 
         scId = sc.Id, 
         productName = _ProductRepository.GetProductName(sc.Id) 
        }); 

searchShoppingCart = shoppingCart.Where(sc => sc.Id.Equals(productContained.Where(pc => pc.productName.Equals(productName)) 
                      .Select(pc => pc.Id))); 

하지만 나에게도 같은 예외가 있습니다. 다른 해결 방법이 있습니까?

UPDATE

예외 1 인

엔티티에있어서 '선택 System.String GetProductName (INT32)'방식을 인식하지 않고,이 방법은 저장 식으로 변환 할 수없는 발 LINQ.

+2

나는 다른 사람들이 당신을 도울 수 있도록 어떤 예외를 아는 것이 중요합니다 생각합니다. –

+0

어떤 예외가 발생합니까? stacktrace는 무엇입니까? – Alex

+1

"이 예외가 왜 발생하는지 이유를 알고 있습니다."- 어쨌든 나는 그것을 의심합니다. 그러나 어떤 경우에도, 예외가 무엇인지 우리에게 말하지 않을 때 어떻게 제안을 기대할 수 있습니까? – Jon

답변

2

코드를 SQL로 변환하려고 시도하기 때문에 예외가 발생합니다 (그렇게 할 수 없습니다). http://thoai-nguyen.blogspot.it/2011/05/custom-function-entity-framework.html

+0

입니다. 이는 단지 설명 일뿐입니다. 해결 방법은 .ToList()를 사용하는 것입니다. –

+0

죄송합니다. 예외를 지정하지 않으 셨습니다. 내 업데이트를 참조하십시오. – CiccioMiami

+0

목록으로 변환 하시겠습니까? 많은 레코드가 있다면 그것은 정말 광대 할 수 있습니다. 그가 데이터베이스 크기에 대해 확신이 없으면 (또는 앞으로 증가 할 수도 있습니다. 모든 ToList를 찾지 않으려한다고 생각합니다). 나는 저장 프로 시저를 선호한다. –

0

IQueryable (내가하는 것으로 믿는다) 다음 사용자 지정 .NET 메서드에 대한 호출을 쿼리로 변환 할 수 없으므로 예외가 발생합니다.

작업 주위에 모든 가능한 쇼핑 카트를 가져 메모리 제품 목록에 방법을 적용하는 것 - 그것은 전체 목적을 패배 예를 들어, 물론

searchShoppingCart = shoppingCart.ToList().Where(m => productName.Equals(_ProductRepository.GetProductName(m.Id))) 

이 짜증!

더 나은 해결 방법 쇼핑 카트 개체 내에서 제품 탐색 속성을 노출하고 사용하는 것 같은 - 예를 들어,

searchShoppingCart = shoppingCart.Where(m => productName.Equals(m.Product.Name)) 
+1

ToList 대신'AsEnumerable'을 사용하는 것이 더 좋습니다. – spender

+0

감사합니다. VinayC! 귀하의 가정은 정확합니다 가능한 한 지연된 실행을 사용하고 싶습니다. 두 번째 스 니펫의 문제점은 GetProductName 함수가 더 복잡하다는 것입니다. 특히 재귀 적입니다. Moreborer 컴퍼넌트를 유연하고 재사용 가능한 상태로 유지하기 위해 저장소 외부의 탐색 속성을 사용하지 마십시오 – CiccioMiami

+0

@CiccioMiami, 스펜더의 제안을 살펴보십시오. 'AsEnumerable'은 필요할 때까지 모든 장바구니를 가져 오는 것과 다를 수 있습니다. 모든 카트를 메모리로 가져 오지 않으려면 제품 이름 계산/비교를 데이터베이스 레이어로 변환해야합니다. 다른 방법은 없습니다! 아마도 GetProductName 구현을 뷰 또는 테이블 값 함수로 데이터베이스 계층으로 이동하고이를 'ProductName'엔티티로 매핑 할 수 있습니다. – VinayC

관련 문제