【问题标题】:LINQ to Entities does not recognize the method 'Int16 Parse(System.String)' [duplicate]LINQ to Entities 无法识别方法“Int16 Parse(System.String)”[重复]
【发布时间】:2015-11-01 14:21:25
【问题描述】:

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

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()

也无法解决的异常

【问题讨论】:

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


【解决方案1】:

将参数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
                          ...

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2015-09-20
      • 2015-07-20
      • 2017-08-08
      • 1970-01-01
      • 1970-01-01
      • 2012-05-03
      • 1970-01-01
      • 1970-01-01
      • 2013-04-07
      相关资源
      最近更新 更多