나는 이것을 C# 개발자로서 8 일째 인생이라고 말하면서 머리말을 붙일 것이다.IQueryable.Where()에 대한 LINQ 동적 인수
내가 작업중인 프로젝트의 많은 DomainModels에 대해 사용자가 검토/검색 양식을 제출할 때 주어진 테이블의 모든 레코드를 필터링 할 수 있어야합니다.
는 현재 2 %의 짧은 투어는 다음과 같습니다
양식 FooController/검토에 제출합니다.
검토 한 후 사전에에 Params [ '필터']에서 모든 키/값 쌍을 잡고 통과하는 것과 매우 비슷 헬퍼 클래스 호출 FooFinder.ByProperties에 :
public IQueryable<WorkPlan> ByProperties(IDictionary<string, string> properties)
{
var result = ForSite(Convert.ToInt64(properties.DefaultVal("SiteId", "0")));
v);
if(properties.ContainsKeyAndIsNotNullOrEmpty("WorkPlan.Key"))
{
var tempVal = Convert.ToInt64(properties["WorkPlan.Key"]);
result = result.Where(r => r.Id == tempVal);
}
// Multiple of these conditional checks follows
return result;
}
나는 아직도 ... 최대한 repetative 코드를 줄이기 위해 좋아하고
result = ByProperty(properties, "WorkPlan.key", typeof (Int64), r, v => r.id == v);
그러나 그게 전부는 분명히 많은 이유에 대해 작동하지 않을 뭔가를 시도 것 내가 성취하려고하는 것에 대한 생각이 거기에 있습니다. 정말 코드를 단순화하고 일종의 동적 헬퍼/유틸리티를 사용하여 필터링 프로세스를 가속화하고 싶습니다.
다른 아이디어는 리플렉션을 사용하여 직선 비교를하는 것이지만, 다음으로 모든 레코드가 "r => CreatedDatetime> CreatedFrom"보다 큰 CreatedDatime 속성을 확인하는 방법입니다.
아무도 이해가되지 않는 경우 의견을 보내 주시면 문제를 해결하도록 노력하겠습니다.
그게 내 자신에 다이나믹 Linq 라이브러리를 발견했을 때 도달했습니다. 꽤 멋지지만 지금은 구현할 여유가 없습니다. – David