2013-10-03 7 views
1

Я захватываю значение и хочу, чтобы оно появилось в BatchId каждого анонимного типа, созданного с помощью инструкции linq.Нельзя ссылаться на переменную от анонимного типа

Вот код:

var batchId = context.Request["batchid"]; 
    using (var db = new StarterSiteEntities()) 
    { // Get data 
     var transactions = (from t in db.Transactions 
          join td in db.TransactionDetails on t.TransactionID equals td.TransactionID 
          join p in db.Products on td.ProductID equals p.ProductID 
          where t.Exported == false 
          select new 
          { 
           BatchId = batchId, 
           t.FirstName, 
           t.LastName, 
           t.Address1, 
           t.Address2, 
           t.City, 
           t.State, 
           t.Zip_Code, 
           t.Email, 
           t.Phone, 
           t.TotalAmount, 
           t.MonthlyGift, 
           t.DateCreated, 
           p.Fund, 
           ProductFirstName = p.FirstName, 
           ProductLastName = p.LastName, 
           ProductUniversity = p.University, 
           ProductState = p.State, 
           ProductEmail = p.Email, 
           ProductAmount = td.Amount 
          }).ToList(); 
    } 

Когда я делаю это, я получаю сообщение об ошибке:

«Параметр не допускается в этом месте Убедитесь, что„@“знак в. допустимое местоположение или все параметры в этом выражении SQL ».

Как ссылаться на переменную batchId из объявления анонимного типа, или я должен выполнить это другим способом?

+0

Вы можете использовать профайлер для анализа сгенерированного запроса? Какова ценность 'batchId'? – CodeCaster

+0

Удалите BatchId из запроса, когда вы получите список, примените select с BatchId. –

+0

@CodeCaster batchId содержит строковое значение «1234». Если я заменю переменную batchId в выражении «select new ...» со значением «1234», он отлично работает. –

ответ

2

Похоже, вы столкнулись с известной ошибкой в ​​библиотеках доступа к данным SQL Server CE. Вы должны уметь исправлять его на applying this hotfix машинам, которые обращаются к базе данных.

+0

Хорошая работа. Похоже, что это, вероятно, проблема, связанная с дальнейшим тестированием. Если я делаю batchId int, он работает нормально. Если это строка, она терпит неудачу. К сожалению, я не хочу связываться с исправлением, если найду способ обхода. Я попробую что-нибудь еще. –

1

Хотя я думаю, что Адам Марас ответил на мой вопрос. Поскольку я не хотел устанавливать исправление на сервере, я решил решить проблему, используя другой метод.

Поскольку запрос Linq не позволяет мне использовать строковую переменную, и я не мог редактировать значение свойства анонимного типа. Я перестал использовать анонимный тип и создал класс сущности для хранения моих данных транзакции.

Как только у меня есть коллекция объектов TransactionSummary, я могу использовать метод Select() для обновления значения свойства BatchId в каждой записи.

Вот результирующий код:

// Define a custom type to hold the data 
private class TransactionSummary 
{ 
    public string BatchId { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    //...removed lines for brevity... 
} 

//...here is the updated code snippet... 
using (var db = new StarterSiteEntities()) 
{ // Get data 
    var transactions = (from t in db.Transactions 
         join td in db.TransactionDetails on t.TransactionID equals td.TransactionID 
         join p in db.Products on td.ProductID equals p.ProductID 
         where t.Exported == false 
         select new TransactionSummary 
         { 
          FirstName = t.FirstName, 
          LastName = t.LastName, 
          //...removed lines for brevity... 
         }).ToList(); 

    // The client would like a batchID added to each record that we return. 
    var batchId = context.Request["batchid"]; 
    transactions.Select(t => { t.BatchId = batchId; return t; }).ToList(); 
} 
+0

именно то, что я имел в виду. –

Смежные вопросы