Search code examples
c#linqentity-framework

Int.Parse in Linq Expression


I have the following LINQ expression. I want calculate the sum of numeric values in an nvarchar field. I'm using following code to do this, but I get an error when I try to run this.

var m = new MaterialModelContainer();

var list = 
    (from x in
        (
            from inv in m.INVs
            join l in m.LIBs on inv.MESC equals l.MESC
            join o in m.OUTs on inv.MESC equals o.MESC
            join t in m.TRANs on inv.MESC equals t.MESC
            where t.TYPE == "60"
            select new
            {
                l.MESC,
                l.LINE_NO,
                l.UNIT_LINE,
                Description = l.DES + " " + l.PART_NO,
                inv.NEW_QTY,
                o.PJ,
                o.DATE,
                o.QTY,
                o.QTY_REC,
                TranQty = t.QTY,
                tranDate = t.DATE
            }
        )
        group x by
            new
            {
                x.MESC,
                x.LINE_NO,
                x.UNIT_LINE,
                x.Description,
                x.NEW_QTY,
                x.PJ,
                x.DATE,
                x.QTY,
                x.QTY_REC
            }
        into g
        select new
        {
            QTY_Consum_1 = g.Where(c => int.Parse(c.tranDate) >= cuDate && int.Parse(c.tranDate) <= endDate).Sum(d => int.Parse(d.TranQty))
        }
    ).ToList();

Error Description:

LINQ to Entities does not recognize the method 'Int32 Parse(System.String)' method, and this method cannot be translated into a store expression

How can I solve this problem and write this code better than this?

I changed the code to this:

select new
{
    QTY_Consum_1 = g.Where(c => SqlFunctions.StringConvert(c.tranDate) >= cuDate && SqlFunctions.StringConvert(c.tranDate) <= endDate).Sum(d => SqlFunctions.StringConvert(d.TranQty)),
   g.Key.MESC
}
).ToList();

but got this error: enter image description here


Solution

  • You can't use int.parse in where. You can rewrite your query like this:

    var list = (from x in
                    (
                        from inv in m.INVs
                        join l in m.LIBs on inv.MESC equals l.MESC
                        join o in m.OUTs on inv.MESC equals o.MESC
                        join t in m.TRANs on inv.MESC equals t.MESC
                        where t.TYPE == "60" && t.QTY!=""
                        select new
                           {
                               l.MESC,
                               l.LINE_NO,
                               l.UNIT_LINE,
                               Description = l.DES + " " + l.PART_NO,
                               inv.NEW_QTY,
                               o.PJ,
                               o.DATE,
                               o.QTY,
                               o.QTY_REC,
                               TranQty = t.QTY,
                               tranDate = t.DATE
    
                          }
                    ).ToList()
                group x by
                    new
                        {
                            x.MESC,
                            x.LINE_NO,
                            x.UNIT_LINE,
                            x.Description,
                            x.NEW_QTY,
                            x.PJ,
                            x.DATE,
                            x.QTY,
                            x.QTY_REC
                        }
                into g
                select new
                    {
                        QTY_Consum_1 = g.Where(c => int.Parse(c.tranDate) >= cuDate && int.Parse(c.tranDate) <= endDate).Sum(d => int.Parse(d.TranQty)),
                        g.Key.MESC
                    }
               ).ToList();
    

    Call .ToList() method, then use int.Parse(variable).

    Have a nice day.