如何声明匿名类型的List
本文关键字:类型 List 何声明 声明 | 更新日期: 2023-09-27 18:09:41
他们定义了一个ViewModel如下,其中Movie是一个类。然后在Index(…)方法中(在教程的最后,他们正在从一个简单的LINQ查询填充ViewModel,如下面的控制器所示:
ViewModel :
public class MovieGenreViewModel
{
public List<Movie> movies;
public SelectList genres;
public string movieGenre { get; set; }
}
控制器:
public async Task<IActionResult> Index(string movieGenre, string searchString)
{
// Use LINQ to get list of genres.
IQueryable<string> genreQuery = from m in _context.Movie
orderby m.Genre
select m.Genre;
var movies = from m in _context.Movie
select m;
if (!String.IsNullOrEmpty(searchString))
{
movies = movies.Where(s => s.Title.Contains(searchString));
}
if (!String.IsNullOrEmpty(movieGenre))
{
movies = movies.Where(x => x.Genre == movieGenre);
}
var movieGenreVM = new MovieGenreViewModel();
movieGenreVM.genres = new SelectList(await genreQuery.Distinct().ToListAsync());
movieGenreVM.movies = await movies.ToListAsync();
return View(movieGenreVM);
}
Question:在上面的ViewModel中,属性movies的类型是List<movie>
, Index(…)方法中使用的查询是一个只涉及一个表(movies)的简单查询。但是,如果查询涉及到两个表的INNER JOIN,因此返回一个匿名类型的对象,如下面所示呢?在这种情况下,我们如何在ViewModel中声明匿名类型List<.?.>
的列表,然后填充类型为list的属性?>在ViewModel?在下面的例子中,我用List<dynamic>
或List<object>
定义了一个ViewModel,并尝试了myViewModel.list = leftOuterJoinQuery.ToListAsync()
,但得到的错误是Cannot implicitly convert type 'List<<anonymous type: int CategoryId, string CategoryName, string ProdName>>>' to 'System.Collections.Generic.List<dynamic>
:
var innerJoinQuery =
from category in categories
join prod in products on category.ID equals prod.CategoryID
select new { ProductName = prod.Name, Category = category.Name }; //produces flat sequence
:
正如@StephenMuecke下面建议的那样,这个问题可以通过创建另一个包含我的查询返回的属性的视图模型来解决。但是我在想是否有一种方法可以避免创建额外的视图模型
有一种方法可以在不创建新VM的情况下完成它,但我不确定这是正确的方法。
首先,我将把虚拟机打开如下
public class MovieGenreViewModel
{
public ICollection movies;
public SelectList genres;
public string movieGenre { get; set; }
}
定义一个帮助器方法从匿名对象组成列表
public static List<T> CreateList<T>(params T[] elements)
{
return new List<T>(elements);
}
最后,更改Index()方法
中的行从movieGenreVM.movies = await movies.ToListAsync();
var output = await innerJoinQuery.ToListAsync();
movieGenreVM.movies = CreateList(output);