0

C#을 LINQ 내 문제에 대한 해결책이없는 렸기 때문에 내가 그 주제 insteed 새 주제를 열어응용 프로그램 계층이 DAL 계층의 DB를 동적으로 쿼리하는 방법은 무엇입니까?

어떤 조언을 SQL합니다. 이제는 레이어를 다시 디자인하는 데 도움이 필요합니다. Linq To Sql - Making a dynamic search for the Application layer without exposing DAL layer as DLL


내 프로젝트는 DAL, BL, 애플리케이션의 3 가지 레이어로 구성됩니다. Linq2Sql은 DAL 계층에 존재하지 않으며 데이터베이스의 각 테이블에 대한 클래스를 자동 생성하고 ContextObject는 데이터베이스를 관리합니다. DB의 변경으로 인해 해당 클래스의 자동 생성이 이루어지기 때문에이 클래스에서는 아무 것도 바꿀 수 없습니다.

[global::System.Data.Linq.Mapping.DatabaseAttribute(Name="ClientDB")] 
public partial class LinqClientDBDataContext : System.Data.Linq.DataContext 

[global::System.Data.Linq.Mapping.TableAttribute(Name="dbo.Clients")] 
public partial class Client : INotifyPropertyChanging, INotifyPropertyChanged 

이러한 클래스는 BL 계층에 노출됩니다. 응용 프로그램 계층을 LinqClientDBDataContext (ContextObject)에 노출 할 필요가 없으므로 응용 프로그램 계층을 Linq2Sql의 자동 생성 코드 (이 경우 Client 클래스)에 노출시킬 수 없습니다. 그게 내가 DAL.Client 개체에 의해 BL 층에서 생성 된 클라이언트의 "복제"클래스를 만든 이유 : 나는 된 IQueryable 응용 프로그램 레이어를 제공 할 때

private BusinessLogic.Client Convert(ClientDataAccessLayer.Client Client) 
     { 
      return new BusinessLogic.Client(Client.ClientID,..); 
     } 

문제가 온다 응용 프로그램 층이 동적으로 할 수 있습니다 그가 원하는대로 CREAT 쿼리 결과를 필터링 :

public IQueryable<BusinessLogic.Client> Clients() 
     { 
      this.MainDB.Clients.Select<ClientDataAccessLayer.Client, BusinessLogic.Client>((ClientDAL1) => Convert(ClientDAL1)); 
     } 
ClientLogic().Clients().Where((ClientBL1)=>ClientBL1.ClientID==4); 

예외 : 방법 'BusinessLogic.Client의 변환 (ClientDataAccessLayer.Client)는'SQL에 지원되는 변환이 없습니다.

이 코드는이 예외를 제공하며 이유는 알고 있지만 찾을 수 없습니다.이 문제에 대한 더 나은 해결책을 찾으십시오.

내 프로젝트를 다시 디자인하여 응용 프로그램이 동적으로 DB를 쿼리 할 수 ​​있도록 도와주십시오.

감사합니다. Stav Alfi.

답변

1

linq-to-sql 쿼리에서 생성자를 호출 할 수 없습니다. 당신은 당신이 임의의 비의 LINQ - 투 SQL 호환 기능을 호출하는 쿼리의 다른 부분이없는 가정이

// NOTE: this is an expression, not a method 
private static Expression<Func<ClientDataAccessLayer.Client, BusinessLogic.Client>> Convert = 
    x => new BusinessLogic.Client // NOTE: initializer, not a constructor 
    { 
     Id = x.Id, 
     ... 
    }; 

public IQueryable<BusinessLogic.Client> Clients() 
{ 
    this.MainDB.Clients.Select(Convert); 
} 

처럼 컨버터를 작성해야 오류가 멀리 가야한다.

+0

놀랍게도 작동 중입니다! 하지만 이니셜 라이저와 컨트럭터 사이에 어떤 차이가 있습니까? 이 솔루션은 여전히 ​​BusinessLogic.Client에 대한 매개 변수가없는 생성자를 만들도록했습니다. –

+1

@StavAlfi 초기화 프로그램은 표현식입니다. 생성자는 메서드 호출입니다. Linq-to-SQL 쿼리 공급자는 식만 조사 할 수 있습니다. –

+0

시간 내 주셔서 감사합니다. –