LINQ to Entities 选择新建

Posted

技术标签:

【中文标题】LINQ to Entities 选择新建【英文标题】:LINQ to Entities Select New 【发布时间】:2012-07-14 07:37:52 【问题描述】:
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" 正在运行?

【问题讨论】:

可能重复:***.com/questions/6998957/… 是“main.F_ADDRESS(4588)”任何函数或sp 是的,F_ADDRESS是mysql函数, 我认为返回匿名对象是不合法的……你需要在方法内部进行处理 您是否尝试过直接在 db 中查询“SELECT main.F_ADDRESS(4588)”。有用吗? 【参考方案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; 

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

【讨论】:

嗨 JonSkeet,为什么我收到错误“数据源是无效类型。它必须是 IListSource、IEnumerable 或 IDataSource。” @cnrars:嗯,你还没有展示你在做什么的结果,或者你在哪里得到了那个例外。如果您在列表视图或类似的东西中绑定到 this,您希望将结果放在列表中 - 但在这样的列表中绑定 单个值 很奇怪。

以上是关于LINQ to Entities 选择新建的主要内容,如果未能解决你的问题,请参考以下文章

使用 Linq to Entities (EF6) 动态选择列名

在 LINQ to Entities 中重用选择表达式

LINQ to Entities - 选择用户的所有朋友以及他们之间的聊天

使用Linq to Entities在一个请求中选择计数和计数

在 Linq-to-Entities 查询中格式化日期会导致异常

LINQ to Entities 无法识别方法“System.TimeSpan Subtract(System.DateTime)”方法