2011-10-26 1 views
1

시스템에는 여러 클래스의 모델 (예 : 작업, 송장, 리포트)이 있습니다. 각 테이블에 대해, 로깅 된 회사에 따라 일부 매개 변수 (예 : companyID). 그리고 모든 테이블, 모든 쿼리, 모든 저장 등에 대해 반드시이 매개 변수를 관찰해야합니다. 이 매개 변수를 추가하는 각 쿼리에 대해 EF에게 LINQ를 알리는 간단한 방법이 있습니까? 즉, 난 그냥 입력하는 경우 :LINQ에 의한 EF의 모든 모델에 대해 일반적인 WHERE 매개 변수를 사용하는 방법은 무엇입니까?

List<Report> list = db.Reports.Where(r => r.companyID = idOfLoggedComp) 

감사 답변에 대한 많은처럼 기록 된 회사의 회사 ID 만 관련 기록을 선택 하였다

List<Report> list = db.Reports; 

.

답변

0

간단한 대답은 no입니다. EF는 전역 필터가 완전히 누락되었습니다. 당신은 어떤 래퍼 클래스를 만들고 사용자 정의 내부 쿼리가 같은 IQueryable 노출 숨길해야합니다

public class CompanyRestrictedDataAccess 
{ 
    private int _companyId; 
    private ObjectContext _context; 

    public CompanyDataAccess(int companyId, ObjectContext context) 
    { 
     _companyId = companyId; 
     _context = context; 
    } 

    public IQueryable<Reports> Reports 
    { 
     get 
     { 
      return _context.Reports.Where(r => r.CompanyId == _companyId); 
     } 
    } 
} 

을하지만 때문에 이것은 매우 가난 해결 여전히 :

  • 당신은 대신 상황
  • 의 쿼리를 위해이 클래스를 사용해야합니다
  • 직접 액세스에서만 작동합니다. 열렬한로드 및 지연로드는 모든 조건을 완전히 무시합니다 (EF에서 열망하고 게으른로드도 필터링 할 수 없음).

응용 프로그램에서 로딩을 올바르게 처리해야합니다.

EF가 제공하는 유일한 해결책은 조건부 매핑이지만 EDMX에서 직접 하드 코딩 된 단일 필터링 조건이므로 응용 프로그램이 단일 회사에서만 작동합니다.

0

당신이 회사 테이블에 ID 필드를 가리키는 당신의 테이블에 FKS이있는 경우 다음과 같이 단순히 맥락에서 "회사"테이블을 통해 이들에 액세스하여 모든 관련 테이블을 필터링 할 수 있어야한다 :

List<Report> list = db.Company.Reports; 

많은 번거 로움없이.

또는, 당신은 아직 상황에서 기업이없는 경우 :

var company = db.FirstOrDefault(c => c.ID == companyId); 
List<Report> list = company.Reports; 
0

EF는 기본적으로이 기능을 지원하지 않지만 도움이되는 디자인 패턴이 있습니다.

특히 저장소와 결합 된 기준 패턴. This article은 좋은 읽을 거리 입니다.

기준을 작성하고 결합하는 방법을 설명합니다 (데코레이터 패턴). 기본 조건 클래스에 필터를 추가하면 모든 조건에 추가되었는지 확인할 수 있습니다.

필터링 필터링이 포함 된 탐색 데이터는 Ladislav가 지적한 것처럼 훨씬 더 어렵습니다. Expression Visitor를 사용하여 쿼리를 변경하거나 기본 Criteria 클래스를 사용하여 구현하기 쉬운 Linq To Objects 필터를 수행 할 수 있지만 데이터베이스에서 데이터를로드한다는 의미입니다.

0

도움이 될지 확실하지 않습니다. 이런 식으로 할 수 있습니다.

string whereClause = ""; 

if(cId > 0) 
{ 
whereClause += "it.companyID [email protected] && " 

ob.Add(New ObjectParameter("companyID", cId)); 

} 

// 당신은 더를 사용하여 다른 매개 변수를 추가 할 수 있습니다 경우 조건 ..

whereClause = whereClause.Remove(whereClause.Length, -3); 

qry = dEntity.Reports.Where(whereClause, ob.ToArray); 
관련 문제