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