매우 간단한 테이블에서 쿼리를 실행하려고하는데 어떤 결과도 얻지 못하고 있습니다.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 (작성)와 그 동적 부서를 연결하는 방법을 모른다 항목. 왜 응용 프로그램이 저장하는 이유를 모르겠다)
감사합니다, 벤.
나는 쓰지 않았다. :-) – Ben