【发布时间】:2017-11-07 13:23:07
【问题描述】:
我有 2 个模型:
class User
{
int Id { get; set; }
string Name { get; set; }
virtual HashSet<Book> Books { get; set; }
}
class Book
{
int Id { get; set; }
string Name { get; set; }
int UserId { get; set; }
byte[] CoverImage { get; set; }
virtual User User { get; set; }
}
以及一个包含用户的 ModelView,以及最新书籍中的字段:
class UserViewModel
{
int Id { get; set; }
string Name { get; set; }
string LatestBookName { get; set; }
bool hasCoverImage { get; set; }
}
我在从数据库返回的数据中填充 bool 属性时遇到了一些问题。获取用户和他们的书籍很简单,但事实证明,转换到 viewModel 更难。
var usersAndBooks = dbContext.Users.Include(Books); // pseudocode here, but the real thing works
这里是我需要帮助的地方:
var viewModel = usersAndBook.Select(u => new UserViewModel()
{
Id = u.Id,
Name = u.Name,
LatestBookName = u.Books.Count > 0 && u.Books.OrderByDescending(b => b.Id).FirstOrDefault().Name, //works OK
//neither of these work:
//hasCoverImage = u.Books.Count > 0 && c.Books.OrderByDescending(b => b.Id).First().CoverImage.Any()
//hasCoverImage = u.Books.Count > 0 && c.Books.OrderByDescending(b => b.Id).First().CoverImage.Length > 0
}
我尝试通过查看字节数组来设置 hasImage 值,但出现运行时错误:
"DbIsEmptyExpression 需要一个集合参数。\r\n参数 名称:参数”
对于.Any()
"LINQ 不支持 LINQ 表达式节点类型 'ArrayLength' 实体。”
对于.Length > 0
【问题讨论】:
-
.FirstOrDefault().Name听起来很危险(属性 LatestBookName) -
我已更新问题中的代码以进行测试。这是对我正在做的事情的简化,所以我留下了一些空检查。这些不是我想要解决的问题。
-
@fubo 字节数组永远不会为空,如果不使用就为空。
-
@Console
u.Books.Count > 0 && u.Books.OrderByDescending(b => b.Id).FirstOrDefault().Name不应该编译,但u.Books.OrderByDescending(b => b.Id).FirstOrDefault().Name是安全的。记住什么在客户端执行,什么被翻译成 SQL。这将被翻译成Name访问只会导致null如果没有找到Book对象。
标签: c# asp.net-mvc linq