LINQ to Entities无法识别方法' Int16 Parse(System.String)'

时间:2015-08-09 16:49:10

标签: c# linq linq-to-sql asp.net-mvc-5

我试图找出导致问题的原因

  

LINQ to Entities无法识别方法' Int16 Parse(System.String)'方法,并且此方法无法转换为商店表达式

执行到达if条件时会发生错误。第if (query.Any())行引发异常,我无法理解原因。你能发现问题吗?

我的查询:

var query = from clt in vclt.cltpar
            join p in vclt.profession //left join
                 on clt.no_prof equals p.no_prof
                 into temp
            from prof in temp.DefaultIfEmpty()
            where
              clt.no_pays == short.Parse(no_pays) &&
              clt.tp_pid == tp_pid &&
              clt.no_pid == no_pid &&
              clt.no_seq == short.Parse(no_seq)
            select new
            {
                clt.no_pays,
                clt.tp_pid,
                clt.no_pid,
                clt.no_seq,
                dt_cre = clt.dat_nais,
                DesigClt = vclt.get_nompren(clt.no_pays, clt.tp_pid, clt.no_pid, clt.no_seq).ToString(),
                AdrClt = prtf.adresseclt(clt.no_pays, clt.tp_pid, clt.no_pid, clt.no_seq).ToString(),
                CodRisque = vclt.get_coderisque(clt.no_pays, clt.tp_pid, clt.no_pid, clt.no_seq).ToString(),
                FormeJur = "",
                Secteur = prof.lib_prof,
                Registre = "",
                MatFisc = "",
                NumTeleph = prtf.get_numtel(clt.no_pays, clt.tp_pid, clt.no_pid, clt.no_seq).ToString(),
                DateDebRel = ogcc.get_datdebrel(clt.no_pays, clt.tp_pid, clt.no_pid, clt.no_seq).ToString(),
                RNE = "",
                cd_dou = "0"
            };

if (query.Any())
{
     stuff here
}

更新 我告诉我在查询之外进行了转换,如下所示

short n_pays = short.Parse(no_pays.ToString());
short n_seq = short.Parse(no_seq.ToString());

但是这会抛出一个异常,即使我使用ToString()

也无法解决

2 个答案:

答案 0 :(得分:2)

将参数no_paysno_seq的解析移到查询之外。 EF和LINQ2SQL无法将所有函数/表达式转换为SQL代码,因此查询失败。它在query.Any()失败,因为在此行,查询将转换为SQL并发送到SQL服务器。

var nopays = short.Parse(no_pays);
var noseq = short.Parse(no_seq);
var query = from clt in vclt.cltpar
                        join p in vclt.profession //left join
                            on clt.no_prof equals p.no_prof
                            into temp
                        from prof in temp.DefaultIfEmpty()
                        where
                          clt.no_pays == nopays &&
                          clt.tp_pid == tp_pid &&
                          clt.no_pid == no_pid &&
                          clt.no_seq == noseq
                          ...

答案 1 :(得分:1)

此行为是设计使然。您正在尝试将.NET库函数嵌入到EF查询中。因为它不能翻译成SQL,所以不支持。

您必须重写查询,而不使用.Parse()。

这个特殊情况可能不会太难。将字符串转换为LINQ查询的