2011-01-13 3 views
1

작동하지 :C# 술어 빌더 나는 다음과 같은 코드에서 술어 빌더를 사용하는 것을 시도하고있다

public ListResults<DBAccountDetail> GetAccountDetail(string[] salesForceKey) 
    { 
     try 
     { 
      using (var c = new SalesForceDataContext()) 
      { 
       var predicate = PredicateBuilder.False<DBAccountDetail>(); 

       foreach (var keyword in salesForceKey) 
       { 
        var temp = keyword; 
        predicate = predicate.Or(p => p.Id.Contains(temp)); 
       } 

       var lret = c.DBAccountDetails.AsQueryable().Where(predicate).ToList(); 
       return new ListResults<DBAccountDetail>(lret); 
      } 
     } 
     catch (Exception ex) 
     { 
      LogError("GetLegacyRateLetters()", ex); 
      return new ListResults<DBAccountDetail>(ex); 
     } 
    } 

문제는이 라인에 있다는 것입니다 :

predicate = predicate.Or(p => p.Id.Contains(temp)); 

p.Id 밖으로 인텔리 않을 것이며을 던졌습니다 컴파일 오류 :

No overload for method 'Or' takes 1 arguments 

What is PredicateBuilder

+0

DBAccountDetail.Id는 어떤 유형입니까? 그것이 int 인 경우 문자열을 "포함"할 수있는 방법을 물어볼 것입니다. – StriplingWarrior

+0

문자열입니다. 나는 실제로 사용하고 싶다 : (p => p.Id == temp) –

+0

당신이 받고있는 전체 오류를 붙여주세요. 내가 할 수있는 한 그것이 효과가 있다고 말할 수있다. –

답변

0

컴파일러는 Or의 제네릭 형식을 추측 할 수 없습니다. 당신은

var predicate = 
salesForceKey.Aggregate(
    PredicateBuilder.False<DBAccountDetail>(), 
    (accumulatedPredicate, keyword) => accumulatedPredicate.OrDBAccountDetail>(p => p.Id.Contains(temp)) 
); 
+0

위 코드에서 다음과 같은 오류가 발생합니다. 오류 'System.Linq.Expressions.Expression.Or (System.Linq.Expressions.Expression, System.Linq.Expressions.Expression)이 아닌 일반 메서드'는 형식 인수로 사용할 수 있습니다. –

1

당신이 p.Id에 인텔리을받지 못하고있는 것은 하더군요 사실과 foreach는 1 라인에 수 있어야 여담으로

predicate = predicate.Or<DBAccountDetail>(p => p.Id.Contains(temp)) 

직접 제공하는 시도 DBAccountDetail 아마도 존재하지 않았거나, 게터가 없거나, 사적인 것입니다. "p"에 대해 인텔리 센스를 얻지 못하면 컴파일러가 DBAccountDetail을 올바르게 해석하지 못할 수도 있습니다. 더 많은 정보가 없으면 문제가 무엇인지 명확하지 않습니다. 이

c.DBAccountDetails.Where(d => salesForceKey.Contains(d)) 

... 그리고 :

그러나, 엔티티 프레임 워크 및 LINQ의 최신 버전이 같이 모두 지원 구문을 SQL 것을주의하는 것이 아마 가치가

c.DBAccountDetails.Where(d => salesForceKey.Any(k => k == d)) 

하나 이 경우 PredicateBuilder가 불필요하게됩니다.

+1

c.DBAccountDetails.Where (d => salesForceKey.Contains (d.Id)). ToList(); <---이 라인은 완벽하게 작동했습니다! 고맙습니다. –

0

동일한 문제가 있지만 다른 프로젝트에서 PredicateBuilder 클래스를 배치했습니다. 일단 내 LINQ to Sql 클래스와 같은 프로젝트로 옮기면 오류가 사라집니다.