无法从匿名类型引用变量

时间:2013-10-03 21:39:20

标签: c# linq anonymous-types

我正在抓取一个值,并希望它出现在通过linq语句创建的每个匿名类型的BatchId中。

以下是代码:

    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变量,还是应该以另一种方式完成此操作?

2 个答案:

答案 0 :(得分:2)

看起来您遇到了SQL Server CE数据访问库中的已知错误。您应该能够通过applying this hotfix将其修复到正在访问数据库的计算机上。

答案 1 :(得分:1)

虽然我认为Adam Maras回答了我的问题。因为我不想在服务器上安装hot-fix,所以我最终使用不同的方法来解决问题。

由于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();
}