0

いくつvarかのクエリに等しいretValという変数があります。いくつかの条件の後、私はそれを別のクエリと同一視したいと思います。しかし、のようなエラーが発生しますimplicit cast of type "System.Collections.Generic.IEnumerable<AnonymousType#1>" in "System.Collections.Generic.IEnumerable<AnonymousType#2>" is impossiblevar別の変数を定義したくない理由を私に尋ねることができます。foreachこれはサイクルで使用されるためです。コードを見てみましょう:

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て、それを新しく定義された変数にキャストする方法は?

4

3 に答える 3

5

varは暗黙的に型付けされた変数を意味します。つまり、その型はコンパイル時に決定されます。したがって、最初の使用では匿名型が割り当てられ、2番目の使用では別の匿名型を割り当てようとしますが、それはできません。

匿名オブジェクトの代わりにクラスを使用するようにコードを変更してから、それに投影することができます。そうすれば、現在行っていることを実行できます。次のようなクラスを作成できます。

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

次に、selectステートメントを次のように変更して投影します。

var retVal = ......
             select new MyClass
               {
                  Value = groupItem.Value,
                   Sms = groupItem.Sms
               };  
于 2013-03-27T04:35:01.760 に答える
3

射影に使用している匿名クラスは私たちには同じように見えますが、コンパイラーに関する限り、これらは2つの別個のクラスであるため、エラーにAnonymousType#1とAnonymousType#2が表示されます。

1つの解決策は、groupItem自体のプロパティのみを使用しているため、匿名クラスで投影するのではなく、単に「groupItem」を選択することです。これにより、同じIQueryableタイプが得られます。

補足:「retVal.ToArray()。Length == 0」を「!retVal.Any()」に置き換える必要があります

于 2013-03-27T04:40:15.273 に答える
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ループはsを反復処理することを認識しますValueSmsThing

于 2013-03-27T04:42:58.357 に答える