2012-11-07 3 views
6

PredicateBuilder에 대해 알아야합니다.PredicateBuilder 사용에 도움이 필요합니다.

var predicate = PredicateBuilder.True<employee>(); 

if (!string.IsNullOrEmpty(txtAddress.Text)) 
    predicate = predicate.And(e1 => e1.Address.Contains(txtAddress.Text)); 
if (!string.IsNullOrEmpty(txtEmpId.Text)) 
    predicate = predicate.And(e1 => e1.Id == Convert.ToInt32(txtEmpId.Text)); 
if (!string.IsNullOrEmpty(txtDesc.Text)) 
    predicate = predicate.And(e1 => e1.Desc.Contains(txtDesc.Text)); 
if (!string.IsNullOrEmpty(txtName.Text)) 
    predicate = predicate.And(e1 => e1.Name.Contains(txtName.Text)); 

EmployeeDataContext edb= new EmployeeDataContext(); 
var emp = edb.Employees.Where(predicate); 
grdEmployee.DataSource = emp.ToList(); 
grdEmployee.DataBind(); 

는 무엇인가 그 Employee 객체 사이의 하나의 브라켓에 비해보다 더 큰 : 그것을 사용하는 방법의 거의 모든 예에, 그들은 다음과 같이 코드를 보여? 나는 그 두뇌에 내 두뇌를 쌓았다. 나는 Linq를 SQL 엔티티에 사용하고 있으며 직접 시도 할 때 컴파일 오류가 발생합니다.

"에 Linq에 테이블에서 캐스팅 할 수 없습니다 ..."

저는 초보자입니다 : 나는 오류가 뭔가를 생각합니다. 뻔한 일이 무엇인지 묻기 위해 나를 용서해주십시오. 고맙습니다.

+0

그'<...>은'제네릭라고, 내가 LINQ를 사용하는 방법을 알고 있지만 maby하지 않는이 도움이 : http://msdn.microsoft.com/en-us/library/bb546142.aspx –

답변

2

@MatsRietdijk이 의견 섹션에 명시된 바와 같이, 이것은 제네릭이 사용됩니다. 기본적으로 제네릭을 사용하면 알려지지 않은 유형/클래스 (이 경우 "직원")에서 작동하는 메서드를 만들 수 있습니다 (where statement을 사용하여 제어 할 수 있음). 당신은 몇 가지 다른 유형 (예를 들어, customer)에 대한 employee 유형을 변경한다면

는 다음 lambda expressions에서 사용할 수있는 특성은 공개적으로 노출 된 어떤 속성에 따라 다를 수있다. 예를 들어 :

var predicate = PredicateBuilder.True<customer>(); 

// There is no "CustomerName" property from employee, but there is for customer objects 
if (!string.IsNullOrEmpty(txtName.Text)) 
    predicate = predicate.And(e1 => e1.CustomerName.Contains(txtName.Text)); 
+0

해답을 가져 주셔서 감사합니다. 나는 그 점을 잊었다. 시도해 볼게. 또한 링크에 대해 MatsReitdijk에게 감사드립니다. 다시 한 번 감사드립니다. –

관련 문제