0
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)”方法,并且此方法无法转换为存储表达式。为什么我收到错误?

但是 Addresss = "ASASAS" 正在运行?

4

1 回答 1

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; }

可怕了——你应该捕获特定的异常,记录它们,然后通常重新抛出它们。就好像什么都没出错一样继续下去几乎是不合适的。

于 2012-07-14T08:10:35.657 回答