【问题标题】:Byte array empty check in LINQ [duplicate]LINQ中的字节数组空检查[重复]
【发布时间】: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 &gt; 0

【问题讨论】:

  • .FirstOrDefault().Name 听起来很危险(属性 LatestBookName)
  • 我已更新问题中的代码以进行测试。这是对我正在做的事情的简化,所以我留下了一些空检查。这些不是我想要解决的问题。
  • @fubo 字节数组永远不会为空,如果不使用就为空。
  • @Console u.Books.Count &gt; 0 &amp;&amp; u.Books.OrderByDescending(b =&gt; b.Id).FirstOrDefault().Name 不应该编译,但 u.Books.OrderByDescending(b =&gt; b.Id).FirstOrDefault().Name 是安全的。记住什么在客户端执行,什么被翻译成 SQL。这将被翻译成Name 访问只会导致null 如果没有找到Book 对象。

标签: c# asp.net-mvc linq


【解决方案1】:

我在这里找到了答案:http://www.nilzorblog.com

这里:StackOverflow post answered by @Habib

这行得通:

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; 引用

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-09
    • 2016-04-23
    • 1970-01-01
    相关资源
    最近更新 更多