2012-07-14 3 views
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는 새로운

하지만 주소 = "ASASAS"가 실행 중입니까?

+0

가능한 복제본 : http://stackoverflow.com/questions/6998957/how-to-call-scalar-valued-function-from-linq-to-entities-server-side – Akhil

+0

은 "main.F_ADDRESS (4588)입니다.) "모든 함수 또는 sp – ethicallogics

+0

예, F_ADDRESS는 mysql 함수, –

답변

1

문제는 쿼리에서 생성 된 표현 트리에 ExecuteScalar 메서드 (Entity Framework 식 구문 분석기에서 알 수없는 메서드)에 대한 호출이 포함되어 있다는 것입니다. 안에는이 나타나지 않습니다. 호출하는 방법을 알기 만하면됩니다. 호출이 존재한다는 것을 알고, 변환 할 수 없기 때문에 실패합니다.

일반적으로 쿼리에서 반환 된 각 결과에 대해 별도의 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; } 

끔찍한 - 당신이 그들을 로그 특정 예외를 포착하고, 일반적으로 그것들을 다시 던진다한다. 거의 결코은 잘못 진행된 것처럼 진행하기에 적절합니다.

+0

안녕하세요 JonSkeet, 왜 "데이터 원본이 잘못되었습니다 .I IListSource, IEnumerable 또는 IDataSource 중 하나 여야합니다."오류가 발생합니다. " –

+0

@cnrars : 글쎄요, 당신은 당신이하고있는 일을 결과로 보지 못했습니다. 리스트 뷰 또는 이와 유사한 것으로 바인딩하는 경우, 결과를리스트에 넣고 싶을 것입니다. 다만, 그러한리스트에 단일의 값을 바인드하는 것은 이상합니다. –