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进行了测试.
实体框架无法将该类型的转换转换为SQL.
您是否有可能改变数据结构以使用适当的数据类型,例如实际DateTime
类型?对于大数据量,这样的转换会影响性能.
我建议您更改数据模型类型以避免这些转换,或者如果数据量总是很小,则先获取数据,然后再使用Linq to Objects.
替换所有你int.Parse
的SqlFunctions.StringConvert(variable)
.没有将String转换为Int的函数.您应该尝试执行反转并使用StringConvert将Int转换为String.
SqlFunctions实用程序将能够在SQL命令中转换该命令.
您不能在 中使用 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)
.
祝你今天过得愉快。
归档时间: |
|
查看次数: |
23784 次 |
最近记录: |