Linq表达式中的Int.Parse

我有以下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)  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)  SqlFunctions.StringConvert(d.TranQty)), g.Key.MESC } ).ToList(); 

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

EF 5:

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

EF 6:

简短回答:

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

答案很长:

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

entity framework无法将该类型的转换转换为SQL。

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

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

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

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

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

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

祝你今天愉快。

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

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

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

我在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))), }