LINQ to Entities选择New

时间:2012-07-14 07:37:52

标签: linq entity executescalar

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”正在运行?

1 个答案:

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

可怕 - 您应该捕获特定的异常,记录它们,并通常重新抛出它们。它几乎永远适合继续进行,好像什么都没有出错。