0
public List<User> Getdata()
{
     using (var context =new  huntableEntities())
     {             
         IQueryable<User> userrecords = (context.Users.Where(x => x.RecuiteReferalId == 24));
         userrecords.ToList().ForEach(u =>
                                         {

                                          u.CurrentCompany =
                                                 u.EmploymentHistories.Where(
                                                         e => e.IsCurrent && e.MasterCompany != null).Select(
                                                             e => e.MasterCompany.Description).FirstOrDefault();
                                                 u.CurrentPosition =
                                                     u.EmploymentHistories.Where(
                                                         e => e.IsCurrent && !string.IsNullOrEmpty(e.JobTitle)).
                                                         Select(e => e.JobTitle).FirstOrDefault();
                                         });
        return userrecords.AsEnumerable().ToList();
     }          
}

object context disposedat return ステートメントを取得しています

クエリとメソッドを作成してみましたIEnumerableが、結果は同じでした。また、遅延読み込みを false に設定してみました。

どこが間違っていると思いますか?

4

3 に答える 3

0

呼び出した後ToList、クエリを実行しているため、エンティティをコンテキストから切断しています-ieへの呼び出しの前にへの呼び出しを削除する必要がToList ありますForEach

userrecords.ForEach(u => ...);

AsEnumerableまた、戻り値の型がであるため、呼び出す必要はありません。クエリを返す前にList<User>呼び出すだけです。ToList

return userrecords.ToList();

これで問題が解決するだけでなく、データベースへのアクセスが 1 回だけになるため、より効率的になります。

于 2013-01-09T13:43:52.383 に答える
0

リストを作成したときにコンテキストが破棄される理由はわかりませんがreturn、コードには予期しない結果をもたらす卑劣なひねりがあります。あなたのForEach発言は何も変わりません!userrecordsは であり、それを 2 回列挙するIQueryableだけです。ForEachToList()return

これを防ぐには、最初にリストを作成します。

List<User> userrecords = context.Users
                        .Include("EmploymentHistories.MasterCompany")
                        .Where(x => x.RecuiteReferalId == 24)
                        .ToList();
userrecords.ForEach(u => ...

これIncludeは、n + 1 クエリを防ぐためです。現在、破棄されたコンテキストは問題になりません。

于 2013-01-09T14:55:17.613 に答える
0

拡張メソッドを実行する代わりに、通常の Foreach ループを使用して、@James が言っていることの利点を得る必要があります。さらに、LINQ クエリをクリーンアップすることもできます。

foreach (var u in userrecords)
{
  u.CurrentCompany = u.EmploymentHistories
                      .FirstOrDefault(e => e.IsCurrent && e.MasterCompany != null)
                      .MasterCompany.Description;

  u.CurrentPosition = u.EmploymentHistories
                       .FirstOrDefault(e => e.IsCurrent && string.IsNullOrEmpty(e.JobTitle))
                       .JobTitle;
}

そして、それを返すだけuserrecords.ToList()です。

ただし、もう 1 つ注意してください。Userレコードのナビゲーション プロパティを使用しようとすると、同じ例外が発生する可能性があります。接続 (したがって失敗)。このような場合は、遅延読み込みをオフにするか、このメソッドで実際にそのプロパティを呼び出して (何も変更せず、単に読み取るため)、接続が閉じられる前に読み込ませることができます。

于 2013-01-09T14:44:58.573 に答える