C# 无法创建常量值…在此上下文中仅支持基元类型或枚举类型
错误: 我得到了上面提到的错误,下面是我的堆栈跟踪: 无法创建类型为的常量值 “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声明: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
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不感兴趣,似乎两者都很相似……但我认为“加入”声明涉及更多的基础设施。