2013-03-27 2 views
0

var 변수에 retVal이라는 쿼리가 있습니다. 어떤 조건 후에 다른 질의와 동일시하고 싶습니다. 하지만 implicit cast of type "System.Collections.Generic.IEnumerable<AnonymousType#1>" in "System.Collections.Generic.IEnumerable<AnonymousType#2>" is impossible과 같은 오류가 발생합니다. 왜 다른 var 변수를 정의하고 싶지 않은지 저에게 질문 할 수 있습니다. 이것은 foreach주기에서 사용되기 때문에. `var` 변수를 다른 쿼리와 동일하게 만드는 법

var retVal = from groupItem in result.AsEnumerable() 
          where groupItem.Sms.First().amountOfParts == (
           (from item in rawSmsList.AsEnumerable() 
           where item.referenceNumber == groupItem.Sms.First().referenceNumber 
           select item).Count() 
          ) 
          select new 
          { 
           Value = groupItem.Value, 
           Sms = groupItem.Sms 
          }; 
       //CONDITION 
       if (retVal.ToArray().Length==0) 
       { 
        //HERE I NEED TO RETVAL EQUATE NEW QUERY 
        retVal = from groupItem in result.AsEnumerable() 
           where groupItem.Sms.First().amountOfParts == (
            (from item in rawSmsList.AsEnumerable() 
            where item.senderNumber == groupItem.Sms.First().senderNumber 
            select item).Count() 
           ) 
           select new 
           { 
            Value = groupItem.Value, 
            Sms = groupItem.Sms 
           };       
       } 

       foreach (var item in retVal)//FOREACH EXPECTS THE SAME RETVAL!!! 

가 어떻게 같은 var 변수에 다른 쿼리를 캐스팅 :의 코드에 살펴 보자? 또는 var 변수 유형을 찾고이를 정의 된 새 변수로 캐스팅하는 방법은 무엇입니까?

답변

5

var은 암시 적으로 입력 된 변수를 의미합니다. 즉, 컴파일 타임에 유형이 결정된다는 의미입니다. 따라서 처음 사용시 익명 유형이 지정되고 초 단위로 다른 익명 유형이 지정됩니다. 그럴 수 없어.

익명 객체 대신 클래스를 사용하도록 코드를 수정 한 다음 프로젝트를 수행하면 지금 수행중인 작업을 수행 할 수 있습니다. 로 select 문을 수정하여 프로젝트 다음

public class MyClass 
{ 
    public int Value {get;set;} 
    public string Sms {get;set;} 
} 

과 : 당신은 같은 클래스를 만들 수 있습니다

var retVal = ...... 
      select new MyClass 
       { 
        Value = groupItem.Value, 
        Sms = groupItem.Sms 
       }; 
+0

아마도 ['SequenceEqual'] (http://msdn.microsoft.com/en-us/library/bb342073.aspx)는 익명 형식의 결과 두 개를 비교하는 데 사용할 수 있습니다. –

+0

@JonathonReinhart, 나는 equate OP가 새로운 쿼리의 결과를 기존의'retVal'에 할당하는 것을 의미한다고 생각합니다. 그 종류는 혼란 스럽지만 코드에서 보입니다. – Habib

+0

익명 형식을 다른 형식으로 캐스팅 할 방법이 없습니까? – Nolesh

3

당신이 당신의 예측을 위해 사용하는 익명 클래스는 우리에게 같은 보이지만, 그들은 컴파일러에 관한 한 두 개의 별도 클래스가 있는데, 그 이유는 AnonymousType # 1과 AnonymousType # 2가 오류로 표시되는 이유입니다.

하나의 해결 방법은 groupItem 자체의 속성 만 사용하므로 익명 클래스로 투영하는 대신 "groupItem"을 선택하는 것입니다. 이렇게하면 동일한 IQueryable 유형이 제공됩니다.

사이드 참고 : "retVal.Any()"

그냥 실제 클래스를 생성하면 ". retVal.ToArray() 길이 == 0"인을

+0

메모 주셔서 감사합니다! +1 – Nolesh

3

하는 하비브의 대답에 추가하려면 교체해야합니다 익명 형식을 사용할 필요가 없습니다 (익명 형식을 사용할 때마다 다른 클래스). 쿼리에서 다음

public class ValueSmsThing   // Give it a better name! 
{ 
    public IDontKnow Value { get; private set; } // specify the type! 
    public SmsNumber Sms { get; private set; } // !! 

    public ValueSmsThing(IDontKnow value, SmsNumber sms) { 
     Value = value; 
     Sms = sms; 
    } 
} 

그리고를 대신 익명 형식 사용하는 :

select new 
{ 
    Value = groupItem.Value, 
    Sms = groupItem.Sms 
}; 

를 사용하여 구체적인 클래스를 지정해야합니다, 그래서 나는 당신의 예에서 유형을 모르는

select new ValueSmsThing(groupItem.Value, groupItem.Sms); 

을 만든 것은 그런 다음 for 루프를 통해 ValueSmsThing의를 반복 알게 될 것이다.

+1

+1 Jonathon, 그냥 내 대답에 비슷한 접근 방식을 추가했습니다 :) – Habib

관련 문제