我有一个名为retVal的var
变量,它等于某个查询。在一些条件之后,我想将它等同于另一个查询。但是我收到了implicit cast of type "System.Collections.Generic.IEnumerable<AnonymousType#1>" in "System.Collections.Generic.IEnumerable<AnonymousType#2>" is impossible
之类的错误。你可以问我为什么我不想定义另一个var
变量。因为这个用于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
变量的类型然后将其转换为新定义的变量?
答案 0 :(得分:5)
var
表示隐式类型变量,这意味着它的类型将在编译时确定,因此在您的第一次使用时,它将被分配一个匿名类型,在您的第二次使用时,您尝试为其分配一个不同的匿名类型,你做不到。
您可以修改代码以使用类而不是匿名对象然后投射到那个,然后您将执行您现在正在执行的操作。您可以创建类:
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
};
答案 1 :(得分:3)
您用于投影的匿名类看起来与我们相同,但就编译器而言,它们是两个独立的类,这就是为什么您会看到AnonymousType#1和AnonymousType#2错误。
一种解决方案是简单地选择“groupItem”而不是使用匿名类进行投影,因为您只使用了groupItem本身的属性。这会给你相同的IQueryable类型。
旁注:你应该用“!retVal.Any()”替换“retVal.ToArray()。Length == 0”
答案 2 :(得分:3)
添加到Habib的答案:
只需创建一个实际的类而不是使用匿名类型(每次使用它时都是一个不同的类)。我不知道您的示例中的类型,因此您必须指定:
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
s。