2009-04-29 4 views
1

Entity Framework 개체에 대해 LINQ 쿼리가 생성되었습니다. 검색어 요약은 다음과 같습니다.LINQ to Entity : "선택"부분에 Contains를 사용하면 예기치 않은 오류가 발생합니다.

//a list of my allies 
List<int> allianceMembers = new List<int>() { 1,5,10 }; 

//query for fleets in my area, including any allies (and mark them as such) 
var fleets = from af in FleetSource 
      select new Fleet 
      { 
       fleetID = af.fleetID, 
       fleetName = af.fleetName, 
       isAllied = (allianceMembers.Contains(af.userID) ? true : false) 
      }; 

기본적으로 내가하고있는 일은 일련의 차량을 얻는 것입니다. alliance 회원 목록에는 나와 동맹 관계에있는 모든 사용자의 INT가 포함됩니다. 함대의 소유자가 목록에 포함되어 있으면 isAllied = true를 설정하고 그렇지 않으면 false로 설정하려고합니다. 나는이 (가)에 포함되어 사용했다면 나는이 오류가 이해할 수

"엔티티에 LINQ는 방법 '부울이 포함 (INT32)'방법을 인식하지 않습니다"

내가 이렇게

, 나는 예외를보고 있어요 쿼리의 어디 부분,하지만 왜 내가 선택에서 그것을 얻을까요? 이 시점까지는 쿼리가 실행되어 결과를 반환했다고 가정합니다. 이 작은 코드는 내 데이터를 전혀 제약하지 않습니다.

내가 isAllied 플래그를 설정하는 데 필요한 것을 어떻게 달성 할 수 있는지에 대한 정보를 얻으시겠습니까?

감사

+1

다음 Contain 엔티티 프레임 워크에서 'Contains' *가 지원됩니다. –

답변

-2
var fleets = from af in FleetSource; 

var x = from u in fleets.ToList() 
         select new Fleet 
         { 
          fleetID = u.fleetID, 
          fleetName = u.fleetName, 
          isAllied = (allianceMembers.Contains(u.userID) ? true : false) 
         } 

나중에는 Contains()을 사용할 수, 쿼리가 실행되는 함대에 ToList() 전화 : 대신 할 수있는 일

는 데이터베이스에서 함대를 검색하고 나중에 isAllied 속성을 설정합니다.

+7

원래의 쿼리를 작동시키는 작업 방법은 allianceMembers 객체에서 끌지 않을 것이지만 모든 객체에서이 객체를 메모리로 끌지 않습니까? –

4

이전의 대답에서이 데친 ...

는 지원되지 않습니다 포함되어 있습니다.

IN과 JOIN은 동일한 연산자가 아닙니다 (IN에 의한 필터링은 쿼리의 카디널리티를 변경하지 않습니다).

이렇게하는 대신 join 메서드를 사용하십시오. 쿼리 연산자를 사용하지 않고서는 이해하기가 다소 어렵지만 일단 이해한다면 얻을 수 있습니다. 여기

var foo = 
model.entitySet.Join( //Start the join 
values, //Join to the list of strings 
e => e.Name, // on entity.Name 
value => value, //equal to the string 
(ModelItem ent, String str) => ent);//select the entity 

var foo = from e in model.entitySet 
join val in values on 
e.Name equals val 
select e; 
+0

제 경우의 조인은 의미가 없습니다. 어쨌든 내 데이터를 제한하려 했더라도 그렇다고 생각합니다. 포함은 선택 부분에서 발생합니다. – bugfixr

2

는 기본적으로 엔티티 프레임 워크가 SQL 문으로 LINQ 쿼리를 번역하려고 시도하지만 Contains을 처리하는 방법을 알고하지 않는 쿼리 연산자를 사용하고 있습니다.

var fleets = (from af in FleetSource 
       select new Fleet 
       { 
        fleetID = af.fleetID, 
        fleetName = af.fleetName, 
        userId = af.userId 
       }).AsEnumerable(); 

foreach (var fleet in fleets) 
{ 
    fleet.isAllied = (allianceMembers.Contains(fleet.userID) ? true : false); 
} 
0

나보다 위에있는 모두는 틀리다 !!! (위반 없음 ...) IEnumerable "Contains"오버로드가 아닌 "Contains"의 IList 오버로드를 사용하기 때문에 작동하지 않습니다. 당신이 IList에 과부하 대신 IEnumerable을 오버로드를 사용하는 컴파일러를 말하고있다는 <int>를 추가

allianceMembers.Contains<int>(af.userID) 

: 간단히로 변경합니다.

+10

그들이 당신보다 위에있는 이유는 그들이 당신보다 모두 덜 나쁘다는 것입니다 ... –