Entity Framework calling MAX on null on Records

前端 未结 9 1560
傲寒
傲寒 2020-12-08 09:29

When calling Max() on an IQueryable and there are zero records I get the following exception.

The cast to value type \'Int32\' failed because the materialize

相关标签:
9条回答
  • 2020-12-08 09:47

    You can use:

    FromSqlRaw("Select ifnull(max(columnname),0) as Value from tableName");
    
    0 讨论(0)
  • 2020-12-08 09:53

    Try this:

    IEnumerable<AlertsResultset> alerts = null;
    
        alerts = (from POA in SDSEntities.Context.SDS_PRODUCT_ORDER_ALERT
                  join A in SDSEntities.Context.SDS_ALERT on POA.ALERT_ID equals A.ALERT_ID
                  orderby POA.DATE_ADDED descending
                  select new AlertsResultset
                  {
                      ID = POA.PRODUCT_ORDER_ALERT_ID == null ? 0:POA.PRODUCT_ORDER_ALERT_ID ,
                      ITEM_ID = POA.ORDER_ID.HasValue ? POA.ORDER_ID.Value : POA.PRODUCT_ID.Value,
                      Date = POA.DATE_ADDED.Value,
                      orderType = SDSEntities.Context.SDS_ORDER.Where(o => o.ORDER_ID == POA.ORDER_ID.Value).FirstOrDefault().ORDER_TYPE,
                      TransactionNumber = POA.PRODUCT_ID.HasValue ? (SDSEntities.Context.SDS_PRODUCT.Where(p => p.PRODUCT_ID == POA.PRODUCT_ID.Value).FirstOrDefault().TRANSACTION_NUMBER) : (SDSEntities.Context.SDS_ORDER.Where(o => o.ORDER_ID == POA.ORDER_ID.Value).FirstOrDefault().TRANSACTION_NUMBER),
                      Publisher = POA.PRODUCT_ID.HasValue ?
                      (
                      SDSEntities.Context.SDS_PRODUCT.Where(p => p.PRODUCT_ID == POA.PRODUCT_ID.Value).FirstOrDefault().PRODUCT_TYPE_NUMBER == "ISSUE" ? (from prod in SDSEntities.Context.SDS_PRODUCT
                                                                                                                                                          join ji in SDSEntities.Context.SDS_JOURNAL_ISSUE on prod.PRODUCT_ID equals ji.PRODUCT_ID
                                                                                                                                                          join j in SDSEntities.Context.SDS_JOURNAL on ji.JOURNAL_ID equals j.JOURNAL_ID
                                                                                                                                                          where prod.PRODUCT_ID == POA.PRODUCT_ID
                                                                                                                                                          select new { j.PUBLISHER_NAME }).FirstOrDefault().PUBLISHER_NAME : (from prod in SDSEntities.Context.SDS_PRODUCT
                                                                                                                                                                                                                              join bi in SDSEntities.Context.SDS_BOOK_INSTANCE on prod.PRODUCT_ID equals bi.PRODUCT_ID
                                                                                                                                                                                                                              join b in SDSEntities.Context.SDS_BOOK on bi.BOOK_ID equals b.BOOK_ID
                                                                                                                                                                                                                              where prod.PRODUCT_ID == POA.PRODUCT_ID
                                                                                                                                                                                                                              select new { b.PUBLISHER_NAME }).FirstOrDefault().PUBLISHER_NAME
                      )
                      : (SDSEntities.Context.SDS_ORDER.Where(o => o.ORDER_ID == POA.ORDER_ID.Value).FirstOrDefault().PUBLISHER_NAME),
                      Alert = A.ALERT_NAME,
                      AlertType = A.ALERT_TYPE,
                      IsFlagged = POA.IS_FLAGGED.Value,
                      Status = POA.ALERT_STATUS
                  });
    
    0 讨论(0)
  • 2020-12-08 09:58

    I want to suggest a merge from the existing answers:

    @divega answer works great and the sql output is fine but because of 'don't repeat yourself' an extension will be a better way like @Code Uniquely showed. But this solution can output more complex sql as you needed. But you can use the following extension to bring both together:

     public static int MaxOrZero<TSource>(this IQueryable<TSource> source, 
     Expression<Func<TSource, int>> selector)
            {
                var converted = Expression.Convert(selector.Body, typeof(int?));
                var typed = Expression.Lambda<Func<TSource, int?>>(converted, selector.Parameters);
    
                return source.Max(typed) ?? 0;
            }
    
    0 讨论(0)
提交回复
热议问题