2011-11-08 27 views
0

非常に奇妙なキャスト例外が発生しています。例外は非常にまれです。奇妙なLinqキャスト例外

これは、コードされています。私は取得

protected Guid GetWebsiteLanguage(Guid websiteId, int languageId) 
    { 
     Guid websiteLanguagesId = Guid.Empty; 
     var websites = from item in DataContext.WebsiteLanguages 
         where item.WebsiteId == websiteId && item.LanguageId == languageId 
         select item.Id; 

     if (websites.Count() != 1) 
      throw new ArgumentException("Wrong channel parameters."); 

     try 
     { 
      websiteLanguagesId = websites.First(); 
     } 
     catch (Exception ex) 
     { 
      string errorMessage = websites.First() == null ? "websites.First() is null" : string.Concat("Invalid Guid ", websites.First().ToString()); 
      throw new Exception(string.Concat(ex.Message, " - Log: ", errorMessage, " - Variables: websiteId = ", websiteId.ToString(), " languageId = ", languageId)); 
     } 

     return websiteLanguagesId; 
    } 

例外はこれです:

指定されたキャストは有効でではありません。 - ログ:

無効のGUID ef058612-37db-4b02-aa13-5a528819a5e0

変数: websiteId = db725f45-70fa-4fd0-b344-55bbf17a5c15

言語ID = 2057

これはキャッチの例外の出力。あなたが見ることができるように、我々はGUIDを持っていますが、まだキャスト例外を与えています...

時々、この関数のCount()に間違っています。次に、これはスタックトレースです。

System.Data.Linq.IExecuteResult Execute(System.Linq.Expressions.Expression、QueryInfo、System.Data.Linq.SqlClient.IObjectReaderFactory、System.Object []、System.Object [] 、System.Data.Linq.SqlClient.ICompiledSubClery []、System.Object)STACKTRACE:System.Data.Linq.SqlClient.SqlProvider.Execute(式クエリ、QueryInfo queryInfo、IObjectReaderFactoryファクトリ、Object [] parentArgs、Object [] userArgs System.Data.Linq.SqlClient.SqlProvider.ExecuteAll(式クエリ、QueryInfo []クエリインフォ、IObjectReaderFactoryファクトリ、オブジェクト[] userArguments、ICompiledSubQuery [] subQueries)の System.Dataの でICompiledSubQuery [] subQueries、Object lastResult) Linq.SqlClient.SqlProvider.System.Data.Linq.Provider.IProvider.Execute(式クエリ) at System.Data .Linq.DataQuery 1.System.Linq.IQueryProvider.Execute[S](Expression expression) at System.Linq.Queryable.Count[TSource](IQueryable 1ソース)GetWebsiteLanguageで (GUID websiteId、のInt32言語ID)

そして、これが唯一の解決策をoccuresとき、IISアプリケーションプールのリサイクルを行うことであり、それは再び取り組んでいます。

アイデア?

これは、私はまあ、私は問題の原因を確認していない私のDataContext

public MyDataContext DataContext 
    { 
     get 
     { 
      //Changed this to make this testable with unit tests 
      if (HttpContext.Current != null) 
      { 
       if (!HttpContext.Current.Items.Contains(DataContextKey)) 
        HttpContext.Current.Items.Add(DataContextKey, new MyDataContext(ConnectionString)); 
       return (MyDataContext)HttpContext.Current.Items[DataContextKey]; 
      } 
      else 
      { 
       //When context is not available 
       if (context == null) 
        context = new MyDataContext(ConnectionString); 
       return context; 
      } 
     } 
    } 

答えて

1

を処理する方法です。しかし、とにかくalwasは1つの結果しか持てないのですか?だから、カウントをまったく使わないと思ったことはありますか?コードの後半部分のFirst()もnullにはなりません。

(あなたが複数の結果を持つことができる場合は、代わりにFirstOrDefaultを使用)

のでSingleOrDefaultを(使用にリファクタリングない理由)。:

var websites = (from item in DataContext.WebsiteLanguages 
        where item.WebsiteId == websiteId && item.LanguageId == languageId 
        select item.Id).SingleOrDefault(); 

if (websites == null) 
     throw new ArgumentException("Wrong channel parameters."); 
+0

これが問題を解決するかどうかはわかりません...例外は回数によっては時々発生するが、ウェブサイトでは別の時間が発生するためです。最初(); First()式が間違っていれば、その例外は非常に奇妙です。 (例に示すように) – user1035498

+0

それは再現性があります:つまり、アプリケーションプールのリサイクル後、同じGuidが動作しているか、動作していないことが一貫していますか? – Pleun

+0

それはあなたの問題を解決しないかもしれないことは間違いありませんが(その場合はおそらく異なるSQLが生成されます)、その場合です。しかし、このようなリファクタリングはあなたのパフォーマンスを改善します。 – Pleun

0

を続けます私は同じ問題を抱えてServer Data Typeプロパティをuniqueidentifierに設定して解決しました。