Группировать строки в таблице данных с помощью linq

#c# #linq

#c# #linq

Вопрос:

 [WebMethod(EnableSession=true)]
    public static void ShortFall(List<Dictionary<string, string>> Data)
    {
        List<dynamic> RetData = new List<dynamic>();
        DataTable dtstock = new DataTable();
        DBHelper.DBhelpercls db = new DBHelper.DBhelpercls();
        List<dynamic> ShortfallTempArray = new List<dynamic>();
        List<dynamic> ShortfallTempArray2 = new List<dynamic>();
        List<dynamic> ShortfallArray = new List<dynamic>();
        foreach (Dictionary<string, string> EachItems in Data)
        {
            dtstock = db.GetTable("SELECT ISNULL(Qty,0) AS Stock_Qnty FROM TBLActualStock WHERE ItemCode='"   EachItems["ItemCode"].ToString()   "' AND Mode=1");
            if (dtstock.Rows.Count == 0)
            {
                ShortfallTempArray.Add(new { ItemCode = EachItems["ItemCode"].ToString(), ItemDesc = EachItems["ItemDesc"].ToString(), Qty =EachItems["Qty"].ToString(), Uom = EachItems["Unit"].ToString() });
            }
            else if (((Convert.ToSingle(dtstock.Rows[0]["Stock_Qnty"].ToString()) - Convert.ToSingle(EachItems["Qty"].ToString())) <= 0))
            {
                ShortfallTempArray.Add(new { ItemCode = EachItems["ItemCode"].ToString(), ItemDesc = EachItems["ItemDesc"].ToString(), Qty = (Convert.ToSingle(dtstock.Rows[0]["Stock_Qnty"].ToString()) - Convert.ToSingle(EachItems["Qty"].ToString())).ToString(), Uom = EachItems["Unit"].ToString() });
            }
        }

        var summary = from p in ShortfallTempArray
                      let k = new
                      {
                          ItemCode = p.ItemCode,
                          ItemDesc = p.ItemDesc,
                          Uom = p.Uom
                      }
                      group p by k into t
                      select new
                      {
                          ItemCode = t.Key.ItemCode,
                          ItemDesc = t.Key.ItemDesc,
                          Uom = t.Key.Uom,
                          Qty = t.Sum(p => Convert.ToInt32(p.Qty)) 
                      };
        foreach (var row in summary)
        {
            ShortfallTempArray2.Add(new { ItemCode = row.ItemCode, ItemDesc = row.ItemDesc, Qty = row.Qty.ToString(), Uom=row.Uom });
        }
        HttpContext.Current.Session["Short"] = ShortfallTempArray2;
    }
 

В приведенном выше коде, когда кол-во является целым числом, оно работает правильно;
Но если он плавающий или десятичный, строка ниже застряла с ошибкой.

 Qty = t.Sum(p => Convert.ToInt32(p.Qty))  
 

Я просто меняю Convert.ToInt32 Convert.ToDouble , после чего появляется следующая ошибка….

Невозможно неявно преобразовать тип ‘double’ в ‘int’. Существует явное преобразование (вам не хватает приведения?)

Комментарии:

1. Что такое тип данных p.Qty?

2. Ваш код отлично работает для меня для всех комбинаций Qty того, чтобы быть int or double , а Convert вызов — Convert.ToInt32 or Convert.ToDouble .

3. Зачем вам вообще нужно приведение? Ошибка, которую вы показываете, на самом деле не соответствует коду. Вы действительно пытаетесь спроецировать на известный тип, где Qty an int ?

4. Теперь я помещаю туда весь свой код. Пожалуйста, просмотрите это.

5. @JeffMercado Пожалуйста, проверьте весь мой код

Ответ №1:

вероятно, ошибка относится к типу данных Qty, поскольку она должна быть целочисленного типа.

Ответ №2:

вы, вероятно, пытаетесь сделать:

(int)=(double)

вы должны сделать:

 Qty = (int)t.Sum(p => Convert.ToDouble(p.Qty)); 
 

Или измените тип кол-во на double

Комментарии:

1. Тем не менее ошибка существует. В моей базе данных тип данных Qty — float