Linq表达式中的Int.Parse

Pou*_*uya 12 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();
Run Code Online (Sandbox Code Playgroud)

错误描述:

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();
Run Code Online (Sandbox Code Playgroud)

但得到这个错误 在此输入图像描述

Mah*_*vcs 11

EF 5:

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

EF 6:

简短回答:

youEntity.Where(c=>SqlFunctions.StringConvert((decimal?)c.INTFIELD).Trim() == STRINGVALUE)
Run Code Online (Sandbox Code Playgroud)

答案很长:

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

  • 问题是将字符串解析为int,而不是相反. (6认同)

Pab*_*meo 6

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

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

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


Dan*_*ite 5

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

  • 如何解决这个问题,请给我一个解决方案。谢谢 (4认同)

Ale*_*bin 5

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

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

  • 这不是会起到相反的作用,将数字转换为字符串吗? (2认同)

Pou*_*uya 3

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

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();
Run Code Online (Sandbox Code Playgroud)

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

祝你今天过得愉快。

  • 但where子句将在数据库外执行! (2认同)
  • 最好使用 AsEnumerable 来避免创建中间列表。 (2认同)