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結果のいくつかのフィールドを更新するテーブルオブジェクトを自分に返したいです。

これが私のUpdateメソッドです

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>どこにあるかです。など。Tsys_Log_Deposits_Interest_MastersIQueryable<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 クエリが 1 つのエントリのみを返すことが確実な場合は、同じ条件を内部に持つ 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 に答える