[英]Int.Parse in Linq Expression
我有以下 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();
但出现此错误:
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进行了测试。
用SqlFunctions.StringConvert(variable)
替换所有的int.Parse
。 没有将String转换为Int的函数。 您应该尝试执行反转并使用StringConvert将Int转换为String。
SqlFunctions实用程序将能够在SQL命令中转换该命令。
实体框架无法将该类型的转换转换为SQL。
您是否有可能改变数据结构以使用正确的数据类型,例如实际的DateTime
类型? 对于大数据量,这样的转换会影响性能。
我建议您更改数据模型类型以避免这些转换,或者如果数据量总是很小 ,则先获取数据,然后再使用Linq to Objects。
在你的where子句中,你不能调用int.Parse
。 实体框架不知道如何将其转换为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)
。
祝你今天愉快。
如果您需要很多,我推荐CodeFirstStoreFunctions 。
Step0 -> CodeFirstStoreFunctions nuget 安装
Step1-> 创建一个简单的 sql 标量函数
CREATE FUNCTION [dbo].[ToInt32](@Value VARCHAR(255))
RETURNS INT
AS
BEGIN
RETURN CONVERT(INT, (CASE WHEN ISNUMERIC(@Value) = 1 THEN @Value ELSE
'0' END))
END
Step2 -> 添加OnModelCreating
mb.Conventions.Add(new FunctionsConvention("dbo", typeof(SqlHelper)));
Step3 -> 构建 SqlHelper 类
[DbFunction("CodeFirstDatabaseSchema", "ToInt32")]
public static int ToInt32(string value) => throw new NotSupportedException();
当你需要确保在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))),
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.