[英]C# cannot convert class to IEnumerable
我正在嘗試將我的類轉換為 IEnumerable 對象。
我的班級是:
public class StageTwo : IEnumerable
{
public string Party { get; set; }
public string Currency { get; set; }
public string DrCr { get; set; }
public string Account { get; set; }
public double? Amount { get; set; }
public IEnumerator GetEnumerator()
{
return GetEnumerator();
}
}
下面我有一個方法,我查詢一些數據並將其成功放入我的 StageTwo 對象中。 然后我想復制大部分數據並更改-item.Amount
。
public IEnumerable<StageTwo> Stage2Entries()
{
var queryJoin = (from inn in db.Input.Take(1)
join y in db.InputY on inn.YAction equals y.YAction
orderby inn.Id descending
select new StageTwo
{
Id = inn.Id,
Party = inn.XParty,
Currency = inn.Curr,
DrCr = y.DrAccount1,
Account = y.YAction,
Amount = inn.Amount
});
/*WORKS FINE ABOVE*/
StageTwo stageTwoFinal = new StageTwo();
foreach (var item in queryJoin)
{
stageTwoFinal.Id = item.Id;
stageTwoFinal.Party = item.Party;
stageTwoFinal.Currency = item.Currency;
stageTwoFinal.DrCr = item.DrCr;
stageTwoFinal.Account = item.Account;
stageTwoFinal.Amount = item.Amount;
stageTwoFinal.Id = item.Id;
stageTwoFinal.Party = item.Party;
stageTwoFinal.Currency = item.Currency;
stageTwoFinal.DrCr = item.DrCr;
stageTwoFinal.Account = item.Account;
stageTwoFinal.Amount = -item.Amount;
}
/*Unable to convert here*/
var collection = (IEnumerable<StageTwo>)stageTwoFinal;
return stageTwoFinal;
}
我收到System.InvalidCastException
如何將此類轉換為 IEnumerable?
如果你想返回查詢結果只需寫:
return queryJoin.ToList()
這將執行查詢並將結果作為列表返回。 您只需要:
public IEnumerable<StageTwo> Stage2Entries()
{
var queryJoin = (from inn in db.Input.Take(1)
join y in db.InputY on inn.YAction equals y.YAction
orderby inn.Id descending
select new StageTwo
{
Id = inn.Id,
Party = inn.XParty,
Currency = inn.Curr,
DrCr = y.DrAccount1,
Account = y.YAction,
Amount = inn.Amount
});
return queryJoin.ToList();
}
IEnumerable<T>
是所有集合實現的接口。 StageTwo
代表一個單一的對象,所以它實現IEnumerable<T>
沒有任何意義
如果您使用 EF/EF Core,則可以使用ToListAsync()
異步(即無阻塞)執行查詢:
public async Task<IEnumerable<StageTwo>> Stage2Entries()
{
...
var list=await queryJoin.ToListAsync();
return list;
}
您不需要實現IEnumerable
或其通用版本IEnumerable<T>
即可將類的元素放入集合中。 話雖如此,您可能不想實現該接口:
public class StageTwo
{
public string Party { get; set; }
public string Currency { get; set; }
public string DrCr { get; set; }
public string Account { get; set; }
public double? Amount { get; set; }
}
換句話說,您的StageTwo
集合。 相反,它們只是集合中的元素。
現在您可以在查詢中創建該類的實例並返回該查詢:
var queryJoin = (from inn in db.Input.Take(1)
join y in db.InputY on inn.YAction equals y.YAction
orderby inn.Id descending
select new StageTwo
{
Id = inn.Id,
Party = inn.XParty,
Currency = inn.Curr,
DrCr = y.DrAccount1,
Account = y.YAction,
Amount = inn.Amount
});
return queryJoin;
你看你根本不需要所有的循環和轉換,因為queryJoin
已經是一個IEnumerable<StageTwo>
。
請注意,查詢是延遲執行的,這意味着它會在您迭代元素時運行(例如,通過使用foreach
或ToList
)。 因此,您不會立即看到該查詢的結果,您必須明確地執行該查詢。 有關這方面的解釋,請參閱C#中的延遲執行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.