0

我有一个lambda expression可以从我的表中获取多条记录。

这是表达式

public sys_Log_Deposits_Interest_Master GetDepositsPendingRecord(string glCode, int fromDateID)
        {
            using (var db = new DataClasses1DataContext())
            {
               var deposit = db.sys_Log_Deposits_Interest_Masters.Where(deposits => deposits.cGLCode.Equals(glCode) && deposits.nFromDateID.Equals(fromDateID));
               return deposit; 
            }
        }

我收到一个错误Cannot implicitly convert type IQueryable To Table Object

我想将表对象返回给我Update method,这将更新结果的一些文件。

这是我的更新方法

public void UpdatePendingRecords(string glCode, int fromDateID)
        {
            using (var db = new DataClasses1DataContext())
            {

                var deposit = GetDepositsPendingRecord(glCode, fromDateID);

                foreach (var pending in deposit)
                {
                    pending.cAuthorizedStatus = "Authorized";
                    pending.dAuthorizedOn = DateTime.Now;
                    pending.cAuthorizedBy = HttpContext.Current.User.Identity.Name;

                }
}
}

目前我无法让它工作。

谁能帮我解决这个问题?

任何帮助深表感谢。

4

3 回答 3

2

这是一张桌子的IQueryable<T>任何T类型。sys_Log_Deposits_Interest_Masters例如IQueryable<Log_Deposits_Interest_Master>等。

请注意,作为sys_Log_Deposits_Interest_Masters的实例的表类也实现了该接口。结果是一个不同的实现,它有信息知道它应该从那里获取结果,并在Where.

您还在错误的位置处理上下文,因为在枚举值时它不会存在。

在这种情况下,由于您将直接处理结果而不是对查询应用任何进一步的更改,我将在方法中foreach遍历结果和yield它们,因此它变成了一个枚举块,并且生命周期的处理方式不同. 否则,我要么通过将数据上下文传递给该方法而不是在那里创建它来确保数据上下文的存活时间更长,要么在紧要关头我不会处理它(但只是在紧要关头,而 linq2sql 人说不处理 datacontexts 是安全的,它违反了良好的做法——你真的应该假设这样做是不安全的——而且,它只是在大多数时候是安全的;你想知道它什么时候是安全的吗?我也不想。编辑:今天碰巧带来了一个不安全的例子https://stackoverflow.com/a/12002914/400547)。

编辑示例:

最佳方法:

public IQueryable<Log_Deposits_Interest_Master> GetDepositsPendingRecord(DataClasses1DataContext db, string glCode, int fromDateID)
{
  return db.sys_Log_Deposits_Interest_Masters.Where(deposits => deposits.cGLCode.Equals(glCode) && deposits.nFromDateID.Equals(fromDateID));
}

public void UpdatePendingRecords(string glCode, int fromDateID)
{
  using (var db = new DataClasses1DataContext())
  {

    var deposit = GetDepositsPendingRecord(db, glCode, fromDateID);

    foreach (var pending in deposit)
    {
      pending.cAuthorizedStatus = "Authorized";
      pending.dAuthorizedOn = DateTime.Now;
      pending.cAuthorizedBy = HttpContext.Current.User.Identity.Name;

    }

    //presumably you want to call db.SubmitChanges() here, no?
  }
}

如果您真的必须在调用的方法中包含数据上下文创建,您可以这样做

public IEnumerable<Log_Deposits_Interest_Master> GetDepositsPendingRecord(string glCode, int fromDateID)
{
  using(var db = new DataClasses1DataContext())
    foreach(Log_Deposits_Interest_Master item in db.sys_Log_Deposits_Interest_Masters.Where(deposits => deposits.cGLCode.Equals(glCode) && deposits.nFromDateID.Equals(fromDateID))
      yield return item;
}

但是,如果您想将所做的更改保存回数据库,这并不是很有用,因为您必须调用SubmitChanges()与它们相同的上下文或重新绑定它们。这也意味着如果您要添加另一个Where(),或使用Count()或任何其他可以传递给数据库的东西,它不会是,因为我们已经破坏了可查询的能力。

于 2012-08-17T08:11:44.850 回答
1

从我看到的 db.sys_Log_Deposits_Interest_Masters 代表 sys_Log_Deposits_Interest_Master 对象的集合。您的 Where 查询还返回无法转换为单个对象的对象集合 (IQueriable)。如果您确定您的 Where 查询返回一个且仅一个条目,您可以将其替换为 Single 或 SingleOrDefault 语句,其中具有相同的条件。如果它可以返回多个对象,但只需要第一个,则可以使用 First 或 FirstOrDefault,条件相同。

于 2012-08-17T08:15:23.273 回答
0

添加 .ToList() 扩展,然后像这样:

var deposit = db.sys_Log_Deposits_Interest_Masters.Where(deposits => deposits.cGLCode.Equals(glCode) && deposits.nFromDateID.Equals(fromDateID)).ToList();
于 2012-08-17T08:15:26.087 回答