C# 无法创建常量值…在此上下文中仅支持基元类型或枚举类型

C# 无法创建常量值…在此上下文中仅支持基元类型或枚举类型,c#,linq,visual-studio-2015,C#,Linq,Visual Studio 2015,错误: 我得到了上面提到的错误,下面是我的堆栈跟踪: 无法创建类型为的常量值 “JackHenry.JHAKeys.Model.ADSENTDB.L_表单选择申请人”。只有 在此上下文中支持基元类型或枚举类型 资料来源:“mscorlib” 在System.Threading.Tasks.Task.WaitAll(Task[]Tasks,Int32 毫秒计时,CancellationToken CancellationToken)在 System.Threading.Tasks.Task.Wai

错误:

我得到了上面提到的错误,下面是我的堆栈跟踪:

无法创建类型为的常量值 “JackHenry.JHAKeys.Model.ADSENTDB.L_表单选择申请人”。只有 在此上下文中支持基元类型或枚举类型

资料来源:“mscorlib”

在System.Threading.Tasks.Task.WaitAll(Task[]Tasks,Int32 毫秒计时,CancellationToken CancellationToken)在 System.Threading.Tasks.Task.WaitAll(Task[]Tasks,Int32 在System.Threading.Tasks.Task.WaitAll(Task[] 任务)在 Keys.BusinessLogic.Lending.Document.Fill.LoanFillService.FillLoanObject(字符串 工作ID,布尔文档选择)中 F:\JHA6\JHAKEYS\2018\Services\DEV\ArgoServices\Keys.BusinessLogic\Lending\Document\Fill\LoanFillService.cs:line 422

我已将问题缩小到以下linq声明:

var query = from t in ctx.L_FORMS_SELECTION
            where (ctx.L_FORMS_SEL_APPLICANT.Any(c => (c.form_id == t.form_id)) ||
            ctx.L_FORMS_SEL_APP_INSIDER.Any(c => (c.form_id == t.form_id)) ||
            ctx.L_FORMS_SEL_PROD_CODE.Any(c => (c.form_id == t.form_id)) ||
            ctx.L_FORMS_SEL_PROD.Any(c => (c.form_id == t.form_id)) ||
            ctx.L_FORMS_SEL_QUEUE.Any(c => (c.form_id == t.form_id)) ||
            ctx.L_FORMS_SEL_COLLAT.Any(c => (c.form_id == t.form_id)) ||
            ctx.L_FORMS_SEL_COLLAT_STATE.Any(c => (c.form_id == t.form_id)) ||
            ctx.L_FORMS_SEL_COLLAT_VIEW.Any(c => (c.form_id == t.form_id)) ||
            ctx.L_FORMS_SEL_LOAN.Any(c => (c.form_id == t.form_id)) ||
            ctx.L_FORMS_SEL_LOAN_JURISDICTION.Any(c => (c.form_id == t.form_id)) ||
            ctx.L_FORMS_SEL_LOAN_PURPOSE.Any(c => (c.form_id == t.form_id)) ||
            ctx.L_FORMS_SEL_REG.Any(c => (c.form_id == t.form_id)) ||
            ctx.L_FORMS_SEL_SUBSTITUTE.Any(c => (c.form_id == t.form_id)) ||
            ctx.L_FORMS_SEL_CREDIT_INS.Any(c => (c.form_id == t.form_id)) ||
            ctx.L_FORMS_SEL_APP_MARITAL_STAT.Any(c => (c.form_id == t.form_id)) ||
            ctx.L_FORMS_SEL_APP_STATE.Any(c => (c.form_id == t.form_id)) ||
            ctx.L_FORMS_SEL_RATE.Any(c => (c.form_id == t.form_id)) ||
            ctx.L_FORMS_SEL_COLLAT_COUNTY.Any(c => (c.form_id == t.form_id)) ||
            ctx.L_FORMS_SEL_LOAN_APPSOURCE.Any(c => (c.form_id == t.form_id)))
            && t.shared_service_ind.ToUpper().Trim() == "E"
            select t;

if ((query.FirstOrDefault() != null))
                    return true;
显然,只是试图搜索一堆表,看看其中是否存在值

背景:

我知道它在寻找一个原语(即guid),但我不知道如何将它转换成一个有效的
linq
语句。我搜索了SO,找到了许多讨论类似问题的文章。然而,我要么不完全理解这个问题,要么不理解如何正确解释这些解决方案

VS 2013
中运行时,此查询工作正常。该问题仅在
VS 2015
中出现。我正在使用.netframework4实体框架5(版本4.4)。我使用的是
ReSharper
的许可证,但后来将其关闭。我不确定是否缺少配置或没有正确同步。我当然看过了,一切似乎都很好……不知道为什么visual studio 2015会出问题

我还重新创建了工作区,并使用
VS 2015
重新构建,只是为了确保
VS 2013
没有在某处缓存某些东西

试验

我已将问题简化为仅2个表,下面的查询也给出了此错误:

var tmp2 = from t in ctx.L_FORMS_SELECTION
           where ctx.L_FORMS_SEL_APPLICANT.Any(c => (c.form_id == t.form_id))
           select t;
if ((tmp2.FirstOrDefault() != null))
    return true;
经过进一步简化后,我得到了一个有效的查询。此表包含上述两个表以及第三个表,用于说明:

var tmp3 = from frmSel in ctx.L_FORMS_SELECTION
           join frmApp in ctx.L_FORMS_SEL_APPLICANT on frmSel.form_id equals frmApp.form_id
           join ins in ctx.L_FORMS_SEL_APP_INSIDER on frmSel.form_id equals ins.form_id
           select t3;
if ((tmp3.FirstOrDefault() != null))
    return true;
所以这更好,但我需要组合20张桌子…而不仅仅是3张。我可以做很多连接,但是这种方法不是效率更低并且会产生更多的开销吗?另外,我仍然不确定为什么原始查询在
VS 2013
中有效,但在
VS 2015
中无效-也许我只需要关注这一点,而不需要花精力重构查询

由于查询没有爆炸,我对其进行了扩展并重新创建了原始查询,但这次使用了“join”关键字:

var tmp4 = from t in ctx.L_FORMS_SELECTION
           join app in ctx.L_FORMS_SEL_APPLICANT on t.form_id equals app.form_id
           join appState in ctx.L_FORMS_SEL_APP_STATE on t.form_id equals appState.form_id
           join appSource in ctx.L_FORMS_SEL_LOAN_APPSOURCE on t.form_id equals appSource.form_id
           join appMarital in ctx.L_FORMS_SEL_APP_MARITAL_STAT on t.form_id equals appMarital.form_id
           join appIns in ctx.L_FORMS_SEL_APP_INSIDER on t3.form_id equals appIns.form_id
           join prodCode in ctx.L_FORMS_SEL_PROD_CODE on t.form_id equals prodCode.form_id
           join prod in ctx.L_FORMS_SEL_PROD on t.form_id equals prod.form_id
           join queue in ctx.L_FORMS_SEL_QUEUE on t.form_id equals queue.form_id
           join coll in ctx.L_FORMS_SEL_COLLAT on t3.form_id equals coll.form_id
           join collState in ctx.L_FORMS_SEL_COLLAT_STATE on t.form_id equals collState.form_id
           join collView in ctx.L_FORMS_SEL_COLLAT_VIEW on t.form_id equals collView.form_id
           join collCnty in ctx.L_FORMS_SEL_COLLAT_COUNTY on t.form_id equals collCnty.form_id
           join loan in ctx.L_FORMS_SEL_LOAN on t.form_id equals loan.form_id
           join loanJur in ctx.L_FORMS_SEL_LOAN_JURISDICTION on t.form_id equals loanJur.form_id
           join loanPur in ctx.L_FORMS_SEL_LOAN_PURPOSE on t.form_id equals loanPur.form_id
           join reg in ctx.L_FORMS_SEL_REG on t.form_id equals reg.form_id
           join sub in ctx.L_FORMS_SEL_SUBSTITUTE on t.form_id equals sub.form_id
           join credit in ctx.L_FORMS_SEL_CREDIT_INS on t.form_id equals credit.form_id
           join rate in ctx.L_FORMS_SEL_RATE on t.form_id equals rate.form_id
           where t.shared_service_ind.ToUpper().Trim() == "E"
           select t;
这个不会抛出错误…但也不会返回任何值(在VS 2013中)。最初的linq查询返回了一个值(至少当我在VS2013中运行它时是这样)——奇怪

我查看了原始查询(在VS2013中运行)的结果,发现有一个匹配的form_id。然后我运行了一个foreach查询,当然得到了一个匹配项。似乎出于某种原因,我的“equal”无法正常工作-可能这是因为form_id是一个Guid

经过更多的发展…这就是我的立场。这个查询只是循环并在找到值后立即退出循环。因此,我认为这更有效率,但也有点罗嗦,没有我想要的那么整洁:

foreach (var rec in ctx.L_FORMS_SELECTION)
{
    var app = ctx.L_FORMS_SEL_APPLICANT.Where(c => c.form_id == rec.form_id);
     if (app.FirstOrDefault() != null) return true;

     var appState = ctx.L_FORMS_SEL_APP_STATE.Where(c => c.form_id == rec.form_id);
     if (appState.FirstOrDefault() != null) return true;

     var appSource = ctx.L_FORMS_SEL_LOAN_APPSOURCE.Where(c => c.form_id == rec.form_id);
     if (appSource.FirstOrDefault() != null) return true;

     var appMarital = ctx.L_FORMS_SEL_APP_MARITAL_STAT.Where(c => c.form_id == rec.form_id);
     if (appMarital.FirstOrDefault() != null) return true;

     var appIns = ctx.L_FORMS_SEL_APP_INSIDER.Where(c => c.form_id == rec.form_id);
     if (appIns.FirstOrDefault() != null) return true;

     var prodCode = ctx.L_FORMS_SEL_PROD_CODE.Where(c => c.form_id == rec.form_id);
     if (prodCode.FirstOrDefault() != null) return true;

     var prod = ctx.L_FORMS_SEL_PROD.Where(c => c.form_id == rec.form_id);
     if (prod.FirstOrDefault() != null) return true;

     var queue = ctx.L_FORMS_SEL_QUEUE.Where(c => c.form_id == rec.form_id);
     if (queue.FirstOrDefault() != null) return true;

     var coll = ctx.L_FORMS_SEL_COLLAT.Where(c => c.form_id == rec.form_id);
     if (coll.FirstOrDefault() != null) return true;

     var collState = ctx.L_FORMS_SEL_COLLAT_STATE.Where(c => c.form_id == rec.form_id);
     if (collState.FirstOrDefault() != null) return true;

     var collView = ctx.L_FORMS_SEL_COLLAT_VIEW.Where(c => c.form_id == rec.form_id);
     if (collView.FirstOrDefault() != null) return true;

     var collCnty = ctx.L_FORMS_SEL_COLLAT_COUNTY.Where(c => c.form_id == rec.form_id);
     if (collCnty.FirstOrDefault() != null) return true;

     var loan = ctx.L_FORMS_SEL_LOAN.Where(c => c.form_id == rec.form_id);
     if (loan.FirstOrDefault() != null) return true;

     var loanJur = ctx.L_FORMS_SEL_LOAN_JURISDICTION.Where(c => c.form_id == rec.form_id);
     if (loanJur.FirstOrDefault() != null) return true;

     var loanPur = ctx.L_FORMS_SEL_LOAN_PURPOSE.Where(c => c.form_id == rec.form_id);
     if (loanPur.FirstOrDefault() != null) return true;

     var reg = ctx.L_FORMS_SEL_REG.Where(c => c.form_id == rec.form_id);
     if (reg.FirstOrDefault() != null) return true;

     var sub = ctx.L_FORMS_SEL_SUBSTITUTE.Where(c => c.form_id == rec.form_id);
     if (sub.FirstOrDefault() != null) return true;

     var credit = ctx.L_FORMS_SEL_CREDIT_INS.Where(c => c.form_id == rec.form_id);
     if (credit.FirstOrDefault() != null) return true;

     var rate = ctx.L_FORMS_SEL_RATE.Where(c => c.form_id == rec.form_id);
     if (rate.FirstOrDefault() != null) return true;
}
不确定这是否可以做得更一致-它的代码比原来的多。我希望这就是VS 2015不喜欢的一切=)
感谢您阅读本文,我感谢您提供的任何指导。

Hmm,第二个查询
var tmp2=…
无法生成此类异常<代码>L_表格选择和
L_表格选择申请人
是标准的
DbSet
s,对吗?你能发布异常堆栈跟踪吗?@Ivan Stoev:L_FORMS_SELECTION和L_FORMS_SEL_Appender都是EF表。我已经在上面的描述中包含了堆栈跟踪,是什么让你认为连接比手动解决方法效率低?@Guillaume CR:我不确定……但我认为linq的连接(通过“join”语句)比只搜索表需要更多的开销。我对linq不感兴趣,似乎两者都很相似……但我认为“加入”声明涉及更多的基础设施。