2013-09-09 2 views
0

Может ли кто-нибудь сказать мне, почему это работает в LinqPad, но не как выражение C# в моем приложении?Linq to Entities - «Невозможно создать постоянное значение типа« System.Object »...»

Я использую Entity Framework ...

from p in Productions 
join t in MaterialTransactions 
    on p.Prodn_ID equals t.Prodn_ID 
where p.WO_ID == 2345 
orderby p.Date descending 
select new 
{ 
    Id = p.Prodn_ID, 
    Date = p.Date, 
    Line = (p.ProdLine.Factory.Factory_No + '/' + p.ProdLine.ProdLine_No.ToString()), 
    Qty = p.Qty, 
    Wgt = (double)p.ActWgt, 
    Speed = (double)p.ActSpeed, 
    MaterialUsed = t.Material.Name} 

Я получаю System.Exception «Невозможно создать постоянное значение типа„System.Object“. Только примитивные типы или типы перечисления поддерживаются в этом контексте «.

+0

В LINQ Pad возможно использование LINQ-to-Objects, тогда как LINQ-to-Entities имеет разные правила. Синтаксис один и тот же, но их функциональность/реализация различны. – Belogix

+0

Каковы типы 'SQL' столбцов' ProdLine' и 'Material'? – Sheridan

+1

без таблиц и данных Я бы предположил, что проблема Line = ... является проблемой, попробуйте прокомментировать это и посмотреть, что вы получаете. – BlackICE

ответ

0

Я думаю, что это следующая строка, которая вызывает проблемы:

Line = (p.ProdLine.Factory.Factory_No + '/' + p.ProdLine.ProdLine_No.ToString()) 

Это, так как он сочетает в себе запрос-результат с результатом метода .NET.

Возможно, это сработает. Это задерживает создание содержимого строки-переменной до тех пор, пока запрос не будет запущен.

var query = (from p in Productions 
join t in MaterialTransactions 
    on p.Prodn_ID equals t.Prodn_ID 
where p.WO_ID == 2345 
orderby p.Date descending 
select new { 
    Id = p.Prodn_ID, 
    Date = p.Date, 
    Line1 = p.ProdLine.Factory.Factory_No, 
    Line2 = p.ProdLine.ProdLine_No, 
    Qty = p.Qty, 
    Wgt = (double)p.ActWgt, 
    Speed = (double)p.ActSpeed, 
    MaterialUsed = t.Material.Name 
}) 
.AsEnumerable() 
// This is where the db-stuff stops, and the in-memory stuff begins 
.Select(p => new { 
    p.Id, 
    p.Date, 
    Line = p.Line1 + '/' + p.Line2.ToString(), 
    p.Qty, 
    p.Wgt, 
    p.Speed, 
    p.MaterialUsed 
}); 

var result = query.ToList(); 
0

если вы хотите преобразовать числовые значения в строку в LINQ к лицам, вы должны использовать SqlFunctions (ToString() потерпит неудачу)

(p.ProdLine.Factory.Factory_No + '/' + p.ProdLine.ProdLine_No.ToString()) 

должен быть

SqlFunctions.StringConvert((double)p.ProdLine.Factory.Factory_No) + '/' + SqlFunctions.StringConvert((double)p.ProdLine.ProdLine_No); 

вам вам нужно указать числовое значение в двойное (или десятичное), так как нет никакой перегрузки для StringConvert, принимающей int как параметр.

1

Дубликат вопрос о том, что у меня было несколько дней назад: Best way to concat strings and numbers in SQL server using Entity Framework 5?

Я создал ExpressionVisitor, чтобы решить эту проблему, так что я могу писать чистый код и запустить как можно больше в одном запросе. (включено в ответ)