Linq表达式中的Int.Parse

时间:2012-08-25 00:38:49

标签: c# linq entity-framework

我有以下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();

错误说明:

  

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 个答案:

答案 0 :(得分:10)

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进行了测试。

答案 1 :(得分:6)

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

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

答案 2 :(得分:6)

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

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

我建议您更改数据模型类型以避免这些转换,或者如果数据量始终很小,则先获取数据,然后再使用Linq to Objects。

答案 3 :(得分:5)

在您的where子句中,您无法致电int.Parse。实体框架不知道如何将其转换为SQL。考虑修改您的Where

答案 4 :(得分:4)

您不能在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)

度过愉快的一天。

答案 5 :(得分:0)

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

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

答案 6 :(得分:-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))),
 }