LINQ选择新实体

LINQ选择新实体,linq,entity,executescalar,Linq,Entity,Executescalar,我得到一个错误: LINQ to Entities无法识别方法“System.Object ExecuteScalar(System.String)”方法,并且无法将此方法转换为存储表达式。 为什么我会出错 但是Addresss=“ASASAS”正在运行吗 问题在于,查询生成的表达式树包含对ExecuteScalar方法的调用,实体框架表达式解析器对此一无所知。它不会查看该方法的内部以查看它在做什么——它只知道调用存在,并且由于无法转换而失败 您通常不希望为查询返回的每个结果执行单独的SQL语句

我得到一个错误:

LINQ to Entities无法识别方法“System.Object ExecuteScalar(System.String)”方法,并且无法将此方法转换为存储表达式。 为什么我会出错


但是Addresss=“ASASAS”正在运行吗

问题在于,查询生成的表达式树包含对
ExecuteScalar
方法的调用,实体框架表达式解析器对此一无所知。它不会查看该方法的内部以查看它在做什么——它只知道调用存在,并且由于无法转换而失败

您通常不希望为查询返回的每个结果执行单独的SQL语句吗?你有一个明显的“N+1选择”问题

如果您知道只得到一个结果(由于ID限制),则可以将相关数据提取到对象中,然后执行第二个查询:

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;
        }
顺便说一句,在以
I
开头的类型中使用静态方法是非常奇怪的,这通常是一个接口。此外,此代码:

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

非常可怕-您应该捕获特定的异常,记录它们,并通常重新显示它们。如果什么都没有出错,那么继续进行几乎是不合适的。

可能重复:is“main.F_ADDRESS(4588)”任何函数或spYes,F_ADDRESS是mysql函数,我认为返回匿名对象是不合法的。。。您需要在方法内部进行处理。您是否尝试过直接在db中进行“SELECT main.F_ADDRESS(4588)”查询。它能工作吗?嗨,JonSkeet,为什么我得到错误“数据源是无效的类型。它必须是IListSource、IEnumerable或IDataSource。”@cnrars:你还没有展示你对结果做了什么,或者从哪里得到了异常。如果您在列表视图或类似的视图中绑定到该值,您可能希望将结果放入列表中,但在这样的列表中绑定单个值是很奇怪的。
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 };
}
catch { return null; }