我遇到以下异常。我检查了设计器,类和机会代码是一个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; }
答案 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
,这样您就可以更恰当地处理无效输入,而不是仅仅将结果抛入表达式。