奇怪的Linq Cast Exception

时间:2011-11-08 11:46:58

标签: linq-to-sql guid .net

我得到了一个非常奇怪的Cast Exception。例外情况非常罕见。

这是代码:

    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

languageId = 2057

这是catch的异常输出。正如你所看到的,我们有一个GUID,但他仍在给出一个演员异常...

有时它在这个函数的Count()上出错了。那么这就是stacktrace:

System.Data.Linq.IExecuteResult执行(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(Expression query,QueryInfo queryInfo,IObjectReaderFactory factory,Object [] parentArgs,Object [] userArgs,ICompiledSubQuery [] subQueries,Object的lastResult)    at System.Data.Linq.SqlClient.SqlProvider.ExecuteAll(Expression query,QueryInfo [] queryInfos,IObjectReaderFactory factory,Object [] userArguments,ICompiledSubQuery [] subQueries)    at System.Data.Linq.SqlClient.SqlProvider.System.Data.Linq.Provider.IProvider.Execute(Expression query)    在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应用程序池回收并再次运行。

有什么想法吗?

这就是我处理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;
            }
        }
    }

2 个答案:

答案 0 :(得分:1)

好吧,我不确定导致问题的原因。但我理解你,但是只有一个结果?所以你考虑过根本不使用Count。另外你的代码后半部分的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."); 

答案 1 :(得分:0)

我遇到了同样的问题,并通过在我的DBML中将Server Data Type属性设置为uniqueidentifier来解决它。