15

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

但收到此错误: 在此处输入图像描述

4

7 回答 7

17

英孚 5:

而不是int.Pasrse使用Convert.ToInt32. Entity Framework 将CAST在 SQL 中生成适当的函数。

英孚 6:

简短的回答:

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

长答案:

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

于 2014-06-25T13:52:07.143 回答
6

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

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

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

于 2012-08-25T01:10:40.773 回答
5

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

于 2012-08-25T00:44:08.680 回答
4

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

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

于 2012-08-25T00:59:10.997 回答
4

你不能使用 int.parse in 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();

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

祝你今天过得愉快。

于 2012-08-25T01:58:47.813 回答
-1

有一个糟糕的数据库,我无法编辑,但必须使用它。

我在 Linq-To-Sql 中使用它并且它有效。

首先将字符串转换为对象,然后将其转换为 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))),
 }
于 2014-03-11T16:37:45.647 回答
-1

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

不是快速阅读,这需要时间,但这是您问题的答案(还有更多类似的问题)。

于 2015-08-31T14:49:19.503 回答