C# LINQ中的字节数组空校验
我有两种型号:C# LINQ中的字节数组空校验,c#,asp.net-mvc,linq,C#,Asp.net Mvc,Linq,我有两种型号: 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; }
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; }
}
从数据库返回的数据填充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
,我在这里找到了答案:
在这里:
这项工作:
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,
//this does work:
hasCoverImage = u.Books.Count > 0
&& SqlFunctions.DataLength
(c.Books.OrderByDescending(b => b.Id).First().CoverImage) > 0
}
您需要使用System.Data.Entity.SqlServer引用代码>我在这里找到了答案:
在这里:
这项工作:
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,
//this does work:
hasCoverImage = u.Books.Count > 0
&& SqlFunctions.DataLength
(c.Books.OrderByDescending(b => b.Id).First().CoverImage) > 0
}
您需要使用System.Data.Entity.SqlServer引用
.FirstOrDefault().Name
听起来很危险(属性LatestBookName)我已经更新了要测试的问题中的代码。这是对我正在做的事情的简化,所以我留下了一些空检查。这些不是我想要解决的问题。@fubo字节数组从来都不是空的,如果不使用的话就是空的。@Consoleu.Books.Count>0&&u.Books.OrderByDescending(b=>b.Id)。FirstOrDefault().Name
不应该编译,但是u.Books.OrderByDescending(b=>b.Id)。FirstOrDefault().Name
是安全的。记住在客户机上执行的内容以及转换为SQL的内容。如果没有找到Book
对象,那么Name
访问只会导致null
。.FirstOrDefault().Name
听起来很危险(属性LatestBookName)。我已经更新了要测试的问题中的代码。这是对我正在做的事情的简化,所以我留下了一些空检查。这些不是我想要解决的问题。@fubo字节数组从来都不是空的,如果不使用的话就是空的。@Consoleu.Books.Count>0&&u.Books.OrderByDescending(b=>b.Id)。FirstOrDefault().Name
不应该编译,但是u.Books.OrderByDescending(b=>b.Id)。FirstOrDefault().Name
是安全的。记住在客户机上执行的内容以及转换为SQL的内容。如果没有找到Book
对象,那么Name
访问只会导致null
。