将字符串转换为int时的特定linq异常。 LINQ to Entities无法识别方法'Int32 ToInt32(System.Object)'

时间:2013-06-05 10:10:29

标签: c# linq entity-framework

我遇到以下异常。我检查了设计器,类和机会代码是一个int。

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

public tblOpportunity GetOpportunityByCode(string clientCode, string opportunityCode)
        {
            tblOpportunity opportunity = null;

            ConnectionHandler.Invoke<EntityConnection>((connection) =>
            {
                var context = new xxEntities();
                opportunity = context.tblOpportunities.FirstOrDefault<tblOpportunity>(o => o.ClientCode == clientCode && o.OpportunityCode == Convert.ToInt32(opportunityCode));
            });

            return opportunity;
        }
    }

public partial class tblOpportunity
    {

        public int OpportunityCode { get; set; }

4 个答案:

答案 0 :(得分:4)

 public tblOpportunity GetOpportunityByCode(string clientCode, string opportunityCode)
    {
        tblOpportunity opportunity = null;
        var convertedOpportunityCode = Convert.ToInt32(opportunityCode);
        ConnectionHandler.Invoke<EntityConnection>((connection) =>
        {
            var context = new DMSEntities();
            opportunity = context.tblOpportunities.FirstOrDefault<tblOpportunity>(o => o.ClientCode == clientCode && o.OpportunityCode == convertedOpportunityCode);
        });

        return opportunity;
    }

这应该可以解决问题。您的问题是实体框架无法将您的表达式转换为有效的sql,因为在sql中不存在Convert.ToInt32这样的事实。

答案 1 :(得分:1)

您可以通过先执行转换然后查询数据库来轻松解决此问题:

public tblOpportunity GetOpportunityByCode(
                          string clientCode, string opportunityCode)
{
    tblOpportunity opportunity = null;

    var convertedOpportunityCode = Convert.ToInt32(opportunityCode);

    ConnectionHandler.Invoke<EntityConnection>((connection) =>
    {
        var context = new xxEntities();
        opportunity = context.tblOpportunities
                             .FirstOrDefault(o =>
                                 o.ClientCode == clientCode &&
                                 o.OpportunityCode == convertedOpportunityCode);
     });

     return opportunity;
 }

答案 2 :(得分:1)

LINQ告诉您的是,它没有实现将ToInt32功能推送到后端的功能。但是,您可以在自己的代码中执行此操作而不会出现问题:

public tblOpportunity GetOpportunityByCode(string clientCode, string opportunityCode) {
    tblOpportunity opportunity = null;
    // Do the conversion outside LINQ
    var opCodeInt = Convert.ToInt32(opportunityCode);
    ConnectionHandler.Invoke<EntityConnection>((connection) => {
        var context = new xxEntities();
        opportunity = context.tblOpportunities.FirstOrDefault<tblOpportunity>(
            o => o.ClientCode == clientCode && o.OpportunityCode == opCodeInt
        ); //                                                       ^^^^^^^^^
    });
    return opportunity;
}

答案 3 :(得分:0)

该方法在表达式中不起作用,因为它无法直接转换为后备存储查询语言,但您可以在此之前很好地进行转换;您先从字符串解析为整数,然后在查询中使用本地定义的int

通过这样做,我个人可以使用int.TryParse而不是Convert.ToInt32,这样您就可以更恰当地处理无效输入,而不是仅仅将结果抛入表达式。