2012-04-17 2 views
1

매우 간단한 테이블에서 쿼리를 실행하려고하는데 어떤 결과도 얻지 못하고 있습니다.PredicateBuilder를 사용하는 엔티티에 대한 linq 동적 쿼리

  • ID
  • ActionTypeID
  • TABLENAME을
  • ENTRYID (생성/편집/또는 삭제 된 항목의 ID를()를 생성, 편집 또는 삭제) 표는 다음과 같은 열이 작업 로그를 포함
  • 을 ControlName
  • 사람 (작업이 최선을 다하고 어디에() 액션을 최선을 다하고. 부서 NT 사용자)
  • 날짜

내가 얻고 자했던 것은 ActionTypeID == 1 인 모든 EntryIDs와 동적 문자열 목록 중 하나로 끝나는 Person (department)의 목록입니다. 문제는 조치 로그에서 하나의 EntryID에 대한 첫 번째 조치 만 점검하여 이들 부서 중 하나와 일치해야한다는 것입니다.

나는 이것이 이상하게 들리는 것을 알고있다. 이것은 나의 나쁜 영어와 나의 전 동료의 장애를 디자인하는 데이터베이스로부터 발생할 수 있습니다. 나는 어느 것이 더 나쁜지 모른다.

var predicate = PredicateBuilder.False<ActionLog>(); 
var pOuter = PredicateBuilder.True<ActionLog>(); 

pOuter = pOuter.And(h => h.TableName.ToUpper() == "Contact".ToUpper()); 
pOuter = pOuter.And(h => h.ActionType.ID == 1); 

foreach (var dep in b.DepartmentList) 
{ 
    predicate = predicate.Or(x => x.Person.EndsWith("/" + dep.Value)); 
} 

pOuter = pOuter.And(predicate.Expand()); 

mContactIDs = (from h in db.ActionLog 
orderby h.Date 
select h).AsExpandable().Where(pOuter).Select(x => x.EntryID).Distinct().ToList(); 

그러나 이것은 나에게 '사람'선택한 부서로 끝나는 모든 항목을 반환 내가 원하는 결과를 얻을 수

나의 시도는 이것이다. 이 EntryID로 첫 번째 항목을 확인하기 만하면됩니다.

누군가가 내가 혼란스런 독일어에서 이상한 영어로 번역하려고하는 것을 이해하기를 바랍니다. 그런데

OH-, 그것은 내가 올바른 설명을 찾는 몇 가지 문제가 있다고 생각 닷넷 3.5

편집 이다 - 나는 몇 가지 더미 데이터를 시도 할 것이다. 내 예에서

ID | ActionTypeID | EntryID | TableName | ControlName | Person    | Date 
---------------------------------------------------------------------------------------- 
1 | 1   | 3  | 'Contacts' | NULL  | 'xxxx/department1' | 04/11/2012 
2 | 1   | 3  | 'Contacts' | NULL  | 'yyyy/department2' | 04/11/2012 
3 | 1   | 5  | 'Contacts' | NULL  | 'yyyy/department2' | 04/13/2012 
4 | 1   | 14  | 'Contacts' | NULL  | 'zzzz/department1' | 04/16/2012 

난과 로그 엔트리를 검색 할 것이다 "TABLENAME == '연락처'"및 "ActionTypeID가"사람 "/ department2 '로 끝 새로운 ENTRYID 처음 나타나는 생성"== 1 ". 내가 받고 싶은 결과는 (유일한 EntryIDs) 5, 이는 department2의 사용자가 첫 번째 사용자 인 유일한 항목이므로 5입니다. ActionTypeID 1로이 EntryID를 삽입합니다. 나는 이것이 어리 석다는 것을 알고 있으며 데이터베이스를 설계했다면 이 방법으로 그렇게하지는 않았지만, 이제는 그것을 처리해야합니다. 질의 부서의 양이 동적하지 않을 경우, 나는이 조각 사용합니다 :

IQueryable<ActionLog> log = db.ActionLog; 
mContactIDs = (from k in db.Contacts 
    where (from h in log 
     where h.TableName == "Contacts" 
     && h.EntryID == k.ID 
     && h.ActionType.ID == 1 
     orderby h.Date 
     select h).FirstOrDefault().Person.EndsWith("/" + b.Department) 
    select k.ID).ToList(); 

을하지만 하나의 바보 같은 디자인 (여러 ActionTypeID 1 (작성)와 그 동적 부서를 연결하는 방법을 모른다 항목. 왜 ​​응용 프로그램이 저장하는 이유를 모르겠다)

감사합니다, 벤.

답변

0

대신 엔티티 SQL을 사용하기로 결정했습니다.

 List<int> mContactIDs = new List<int>(); 
     using (var db = new Entities()) 
     { 
      string queryString = @" 
           SELECT 
            VALUE H.EntryID 
           FROM  
            Entities.ActionLog AS H 
           WHERE 
            H.ID IN (
             SELECT VALUE TOP (1) Hi.ID 
             FROM Entities.ActionLog AS Hi 
             WHERE Hi.ActionType.ID = 1 
             AND Hi.TableName = 'Kontakt' 
             AND Hi.EntryID = H.EntryID 
             ORDER BY Hi.Date  
            ) 
           {0} 
           GROUP BY H.EntryID"; 

      List<string> lDepartments = new List<string>(); 
      foreach (var dep in b.DepartmentList) 
      { 
       lDepartments.Add(string.Format(" H.Person LIKE '%{0}' ", dep.Value)); 
      } 

      string sDepartmentQuery = string.Empty; 
      if (lDepartments.Count > 0) 
      { 
       sDepartmentQuery = string.Format(" AND ({0}) ", string.Join(" OR ", lDepartments.ToArray())); 
      } 

      var result = db.CreateQuery<int>(string.Format(queryString, sDepartmentQuery)); 
      if (result != null && result.Count() > 0) 
      { 
       mContactIDs = result.ToList(); 
      } 
     } 
+0

나는 쓰지 않았다. :-) – Ben

0

문제는 포착 된 변수 값 (즉, dep.Value)이 foreach 루프 안에 있다고 생각합니다. 변수의 사본을 만들어 표현식에 사용하십시오. 문제는 here으로 설명되어 있습니다.

foreach (var dep in b.DepartmentList) 
{ 
    var depValue = dep.Value; 
    predicate = predicate.Or(x => x.Person.EndsWith("/" + depValue)); 
} 
+0

안녕하세요. 답변 해 주셔서 감사합니다. 이것은 제가 염두에 두지 않은 문제입니다 - 감사합니다. 하지만 여기서 가장 중요한 문제는 논리적이라고 생각합니다. 나는 그것을 아주 잘 설명하지 않았다고 생각한다. 나는 더미 데이터로 시도 할 것이다. (내 질문을 편집 할 것이다.) – Ben