首页 文章

Linq表达式中的Int.Parse

提问于
浏览
11

我有以下linq表达式 . 我想在Nvarchar字段中计算数值的总和 . 我使用以下代码来执行此操作 . 但是当我尝试运行它时,我收到一个错误 .

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无法识别方法'Int32 Parse(System.String)'方法,并且此方法无法转换为存储表达式

我怎样才能解决这个问题,并且比这更好地编写这段代码?

我将代码更改为此

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();

但是得到这个错误
enter image description here

7 回答

  • 4

    EF 5:

    而不是 int.Pasrse 使用 Convert.ToInt32 . 实体框架将在SQL中生成适当的 CAST 函数 .

    EF 6:

    简短回答:

    youEntity.Where(c=>SqlFunctions.StringConvert((decimal?)c.INTFIELD).Trim() == STRINGVALUE)
    

    答案很长:

    在EF 6中,您必须使用SqlFunctions.StringConvert将数值转换为字符串 . 但它有一个问题 . 它会为结果添加不必要的空格 . 所以比较会失败 . 这就是为什么我把 Trim() 放在那里 . 我用EF 6.1.1进行了测试 .

  • 6

    实体框架无法将该类型的转换转换为SQL .

    您是否有可能改变数据结构以使用正确的数据类型,例如实际的 DateTime 类型?对于大数据量,这样的转换会影响性能 .

    我建议您更改数据模型类型以避免这些转换,或者 if the amount of data will always be small ,然后先获取数据,然后再使用Linq to Objects .

  • 0

    将所有 int.Parse 替换为 SqlFunctions.StringConvert(variable) . 没有将String转换为Int的函数 . 您应该尝试执行反转并使用StringConvert将Int转换为String .

    SqlFunctions实用程序将能够在SQL命令中转换该命令 .

  • 4

    在您的where子句中,您不能调用 int.Parse . 实体框架不知道如何将其转换为SQL . 考虑修改你的 Where .

  • 9

    你不能在 where 中使用int.parse . 您可以像这样重写您的查询:

    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();
    

    调用 .ToList() 方法,然后使用 int.Parse(variable) .

    祝你今天愉快 .

  • 6

    当您需要确保在LINQ to Entities中使用CLR方法时,最好咨询以下来源:https://msdn.microsoft.com/en-us/library/vstudio/dd456828(v=vs.100).aspx .

    这不是一个快速的阅读,它需要时间,但这是你的问题的答案(更多的是它) .

  • -1

    有一个构建严重的数据库,我无法编辑,但必须使用它 .

    我在Linq-To-Sql中使用它,它可以工作 .

    首先将字符串强制转换为object,然后将其强制转换为int .

    from s in db.Students
     select new
     {
         s.Name,
         s.Surname,
         Birthday = new DateTime((int)(object)(s.dateStr.Substring(0, 4)),
                                 (int)(object)(s.dateStr.Substring(4, 2)),
                                 (int)(object)(s.dateStr.Substring(6, 2))),
     }
    

相关问题