Странное исключение Linq Cast - PullRequest
0 голосов
/ 08 ноября 2011

Я получаю очень странное исключение в ролях.Исключение возникает очень редко.

Это код:

    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.*

Это вывод исключения из улова.Как вы можете видеть, у нас есть 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.ICompiledSubQuery [], System.Object) STACKTRACE: at System.Data.Linq.SqlClient.SqlProvider.Execute (запрос на выражение, фабрика запросов QueryInfo, объект IObjectReaderFactory, объект [] parentArgs] userArgs, ICompiledSubQuery [] subQueries, Object lastResult) в System.Data.Linq.SqlClient.SqlProvider.ExecuteAll (запрос выражений, фабрика QueryInfo [] queryInfos, фабрика IObjectReaderFactory, объект [] userArguments, ICompiledSubQuery.Linq.SqlClient.SqlProvider.System.Data.Linq.Provider.IProvider.Execute (запрос выражения) в System.Data.Linq.DataQuery 1.System.Linq.IQueryProvider.Execute[S](Expression expression) at System.Linq.Queryable.Count[TSource](IQueryable 1 источник) в GetWebsiteLanguage (Guid websiteId, Int32 languageId)

И когда это происходит, единственное решение - перезагрузить пул приложений iis, и он снова заработает.

Есть идеи?

Вот так я обрабатываю свой текстовый текст

    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;
            }
        }
    }

Ответы [ 2 ]

1 голос
/ 08 ноября 2011

Ну, я не уверен, что является причиной проблемы. Но я понимаю, вы все равно можете иметь только один результат? Итак, вы решили не использовать граф вообще. Кроме того, ваш First () в последней части кода не может быть нулевым, я думаю.

(Если вы можете получить более одного результата, используйте 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 голосов
/ 23 сентября 2014

У меня была та же проблема, и я решил ее, установив для свойства Server Data Type значение uniqueidentifier в моем DBML.

...