public static object ExecuteScalar(string SQL)
{
try
{
var A = new EGModel.EGEntity().Connection;
var command = ((EntityConnection)(A)).StoreConnection.CreateCommand();
command.CommandType = System.Data.CommandType.Text;
command.CommandText = SQL;
if (((EntityConnection)(A)).StoreConnection.State == System.Data.ConnectionState.Closed)
((EntityConnection)(A)).StoreConnection.Open();
return command.ExecuteScalar();
}
catch { return null; }
}
public object MFICHE(int ID)
{
var i = from b in IConnection.EGEntity().fiche
where (m.ID== ID)
select new { b.Date, m.Name, Addresss = IConnection.ExecuteScalar("SELECT main.F_ADDRESS(4588)") };
return i;
}
我收到错误:
LINQ to Entities无法识别方法'System.Object ExecuteScalar(System.String)'方法,并且此方法无法转换为商店表达式。 为什么我收到错误?
但是地址=“ASASAS”正在运行?
答案 0 :(得分:1)
问题是从查询生成的表达式树包括对ExecuteScalar
方法的调用 - 实体框架表达式解析器对此一无所知。它看起来不是里面的方法来查看它正在做什么 - 它只知道调用存在,并且失败因为它无法翻译它。
您通常不希望为查询返回的每个结果执行单独的SQL语句?你有明显的“N + 1选择”问题。
如果您知道您只获得了一个结果(由于ID约束),您可以将相关数据提取到对象中,然后然后执行第二个查询:
public object MFICHE(int ID)
{
var query = from b in IConnection.EGEntity().fiche
where b.ID == ID
select new { b.Date, b.Name };
// You only expect a single result, right?
var result = query.Single();
// Shouldn't this be using something to do with the result?
var address = IConnection.ExecuteScalar("SELECT main.F_ADDRESS(4588)");
return new { result.Date, result.Name, Address = address };
}
顺便说一句,在以I
开头的类型中使用静态方法是很奇怪的,它通常是一个接口。另外,这段代码:
catch { return null; }
可怕 - 您应该捕获特定的异常,记录它们,并通常重新抛出它们。它几乎永远适合继续进行,好像什么都没有出错。