Int.Parse в выражении Linq
У меня есть следующее выражение 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();
но получил эту ошибку:
![enter image description here]()
Ответы
Ответ 1
Вы не можете использовать 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();
Вызвать .ToList()
метод, затем используйте int.Parse(variable)
.
Хороший день.
Ответ 2
EF 5:
Вместо int.Pasrse
используйте Convert.ToInt32
. Entity Framework будет генерировать правильные CAST
функции в SQL.
EF 6:
Короткий ответ:
youEntity.Where(c=>SqlFunctions.StringConvert((decimal?)c.INTFIELD).Trim() == STRINGVALUE)
Длинный ответ:
в EF 6 вам нужно преобразовать числовое значение в строку с помощью SqlFunctions.StringConvert. но у него есть проблема. Это добавит ненужные пробелы к результату. поэтому сравнение не удастся. Вот почему я поставил Trim()
там. Я тестировал его с помощью EF 6.1.1.
Ответ 3
Замените все ваши int.Parse
на SqlFunctions.StringConvert(variable)
. Нет функции для преобразования String в Int. Вы должны попытаться сделать инверсию и преобразовать Int в String с помощью StringConvert.
Утилиты SqlFunctions смогут перевести команду в команду SQL.
Ответ 4
Entity Framework не может преобразовать этот тип преобразования в SQL.
Есть ли вероятность, что вы можете изменить структуру данных для использования правильных типов данных, таких как фактические типы DateTime
? Для больших объемов данных такие преобразования будут влиять на производительность.
Я бы рекомендовал либо изменить типы моделей данных, чтобы избежать этих преобразований, либо , если количество данных всегда будет небольшим, затем сначала получите данные, а затем используйте Linq для объектов.
Ответ 5
В поле where where вы не можете вызвать int.Parse
. Entity Framework не знает, как преобразовать это в SQL. Рассмотрите возможность пересмотра Where
.
Ответ 6
Когда вам нужно убедиться, что метод CLR можно использовать в LINQ to Entities, вам лучше проконсультироваться с этим источником: https://msdn.microsoft.com/en-us/library/vstudio/dd456828(v=vs.100).aspx.
Не быстрое чтение, это потребует времени, но вот ответ на ваш вопрос (и многое другое понравится).
Ответ 7
Существует плохо сконструированная база данных, которую я не могу редактировать, но ее нужно использовать.
Я использую это в 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))),
}