有类似的问题。如下所示的 ViewModel 库:
public class TagViewModel
{
public int Id { get; set; }
public string Name { get; set; }
public static Expression<Func<SiteTag, TagViewModel>> Select = t => new TagViewModel
{
Id = t.Id,
Name = t.Name,
};
这有效:
var tags = await db.Tags.Take(10).Select(TagViewModel.Select)
.ToArrayAsync();
但是,这不会编译:
var post = await db.Posts.Take(10)
.Select(p => new {
Post = p,
Tags = p.Tags.Select(pt => pt.Tag).Select(TagViewModel.Select)
})
.ToArrayAsync();
因为第二个.Select
是一团糟——第一个实际上是从一个 ICollection 中调用的,它不是 IQueryable,所以它把第一个 Expression 当作普通的Func
,而不是Expression<Func...
. 返回IEnumerable<...
,如本页所述。所以.AsQueryable()
救援:
var post = await db.Posts.Take(10)
.Select(p => new {
Post = p,
Tags = p.Tags.Select(pt => pt.Tag).AsQueryable()
.Select(TagViewModel.Select)
})
.ToArrayAsync();
但这会产生一个新的、更奇怪的问题:要么我得到 Internal Framework...Error 1025,要么我得到带有完全加载.Post
属性的 post 变量,但该.Tags
属性有一个似乎用于延迟加载的 EF 代理对象。
解决方案是通过结束使用 Anonymous 类来控制标签的返回类型:
public class PostViewModel
{
public Post Post { get; set; }
public IEnumerable<TagViewModel> Tags { get; set; }
现在选择它,一切正常:
var post = await db.Posts.Take(10)
.Select(p => new PostViewModel {
Post = p,
Tags = p.Tags.Select(pt => pt.Tag).AsQueryable()
.Select(TagViewModel.Select)
})
.ToArrayAsync();