该模型的类型为List,但此字典需要IEnumerable



在我的控制器中,我有一个简单的LINQ查询:

var results = .....ToList();

然后,我想将"结果"传递到渲染网格的视图中。它采用了一个模型:

@model IEnumerable<XXXX.WebSite.Areas.BrokerDashboard.Models.AccountHBSearchItem>

我没想到这会是个问题,但我明白了:

传递到字典中的模型项的类型为"System.Collections.Generic.List",但此字典需要"System.Collections.Generic.IEnumerable "类型的模型项

这让我很困惑,因为从我读到的所有内容来看,List<T>已经是IEnumerable<T>了。

根据这里的答案,我尝试了这个:

IEnumerable<string> eResults = results.ToList();

但这给我带来了Can implicitly convert错误。

如果我不做.ToList(),那么results是一个IOrderedEnumerable,我得到的是:

传递到字典中的模型项的类型为"System.Linq.OrderedEnumerable",但此字典需要"System.Collections.Generic.IEnumerable "类型的模型项

编辑:

这是整个查询:

var results = Context.GetLeadSalesAccountTransactions(accountID)
.OrderBy(a => a.TransactionDate)
.Select(a =>
{
currentTotal -= a.Debit != null ? (decimal)a.Debit : 0;
currentTotal += a.Credit != null ? (decimal)a.Credit : 0;
return new AccountHBSearchItem
{
AccountTransactionID = a.AccountTransactionID,
LeadID = a.LeadSales != null ? a.LeadSales.Lead.LeadID : 0,
Address = a.LeadSales != null ? a.LeadSales.Lead.Address : string.Empty,
LotNumber = a.LeadSales != null ? a.LeadSales.Lead.LotNumber : string.Empty,
Type = a.AccountTransactionType.GetDisplayName(),
Debit = a.Debit,
Credit = a.Credit,
RemainingBalance = currentTotal,
TransDate = a.TransactionDate
};
}
).OrderByDescending(i => i.TransDate).ToList();

您的List<T1>IEnumerable<T2>似乎有不同类型的泛型参数。从您的第二次尝试中,我看到您使用的是IEnumerable<string>,但型号是IEnumerable<MyNamespace.MyModel>。确保通用参数相同。你可以通过

  • List<MyNamespace.MyModel>
  • IEnumerable<MyNamespace.MyModel>
  • IOrderedEnumerable<MyNamespace.MyModel>

所有这些都是合适的

.ToList的返回类型将为<T>类型。

这意味着<T>可以是任何实现特定接口或是特定具体/抽象类的东西。这取决于使用泛型并返回那些<T>对象的List的类。

<T>上使用接口约束意味着您可以接受<T>(或List<T>),而不知道<T>实际上是什么类型的对象,但仍然根据<T>必须实现的接口与特定属性或方法进行交互。

将在Razor视图中使用的@model被指定为类型为xxx.AccountHBSearchItemIEnumerable(可以迭代的列表)。然后,您可以从@model访问AccountHBSearchItem中可用的属性和方法。例如:@model.AccountTransactionID, @model.LeadId

List<T>不是List<xxx.AccountHBSearchItem>,它可以是任何东西。因此,Razor将无法访问将在视图上用于输出的属性和方法,因为它不能保证<T>对象具有适合的接口。您可能将List<Animal>传递给视图,并且对xxx.AccountHBSearchItem所具有的属性的任何访问都将失败(我希望如此!),因为Animal不是xxx.AccountHBSearchItem

因此,为了解决这个问题,您可以在用于生成List<T>的类中声明,<T>实现了生成视图时需要使用的接口。

假设接口需要以下属性(根据您的数据推测);创建一个具有这些属性的接口,用于将用作<T>的所有类。

public interface IAccountHBSearchItem
{
long AccountTransactionID { get; set; }
long LeadID { get; set; }
string Address { get; set; }
string LotNumber { get; set; }
string Type { get; set; }
bool Debit { get; set; }
bool Credit { get; set; }
decimal RemainingBalance { get; set; }
DateTime TransDate { get; set; }
}

现在指定不同的类实现这个接口:

public class AccountSearchAAA<T> where T : IAccountHBSearchItem
{
// Rest of implementation
public List<T> GetAll()
{
// return list of AccountSearchAAA objects here
}
}
public class AccountSearchBBB<T> where T : IAccountHBSearchItem
{
// Rest of implementation
public List<T> GetAll()
{
// return list of AccountSearchBBB objects here
}
}

然后您可以将@model更改为使用IEnumerable<xxx.IAccountHBSearchItem>(接口)。

现在,您可以生成不同帐户类型的搜索结果,例如,只要它们实现了此接口,然后在同一视图中使用它们。

现在可以通过接口访问可用的属性和方法了。

相关内容