먼저 EntityFramework
데이터베이스를 사용하는 REST WebAPI가 있습니다. 모든 코드는 EDMX
파일, 엔티티, 리포지토리 클래스 및 API 컨트롤러 등을 통해 생성됩니다. LinqKit PredicateBuilder/Linq
로 변환되는 쿼리 문자열을 통해 조건을 추가 할 수있는 몇 가지 필터링 기능이 추가되었습니다. db를 치면 결과를 필터링하는 표현식 . Linq PredicateBuilder를 사용하여 문자열 검색 연결
e.g. /api/Users?FirstName_contains=Rog
이
는User.FirstName
멤버 '로저'모든 사용자를 반환합니다. 이는
PredicateBuilder
을 사용하여 적절한 표현식을 동적으로 작성한 다음
DbSet
에 대해
Where
절로 사용합니다. 예를 들어
: 이제
var fieldName = "FirstName";
var value = "Rog";
var stringContainsMethod = typeof(string).GetMethod("Contains", new[] { typeof(string) });
var parameter = Expression.Parameter(typeof(User), "m");
var fieldAccess = Expression.PropertyOrField(parameter, fieldName);
var fieldType = typeof(User).GetProperty(fieldName, BindingFlags.IgnoreCase | BindingFlags.DeclaredOnly | BindingFlags.Instance | BindingFlags.Public).PropertyType;
var expression = Expression.Lambda<Func<User, bool>>(Expression.Call(fieldAccess, stringContainsMethod, Expression.Constant(value, fieldType))
, parameter)
var andPredicate = PredicateBuilder.True<User>();
andPredicate = andPredicate.And(expression);
var query = Db.Users
.AsQueryable()
.AsExpandable()
.Where(andPredicate);
문제
. 클라이언트가 회원 구성에 따라 결과를 일치 시키길 원합니다.e.g. /api/Users?api_search[FirstName,LastName]=Rog
즉 '로저'의 경기에 대한 first name + last name
검색, 그래서 '로저 SM'을 검색하여 이름 = 로저 이름과 성 = 스미스에 대한 결과를 얻을 수 있습니다. 나는 유창하게 사용 DbSet
를 조회 할 수 있었다면
그것과 같습니다
나는 선재FirstName + " " + LastName
동적으로의 연결을 처리하는
predicate/linq
식을 만드는 고민하고 무엇
users.Where(u => (u.FirstName + " " + u.LastName).Contains("Rog"));
.
t-sql에 CONCAT 함수가 있지만 EF (특히 L2SQL) 기능이이 변환을 지원한다고 생각하지 않습니다. 먼저 .ToList()를 사용하여 모든 항목을 가져온 다음 메모리에서 Selection을 수행해야합니다. – DevilSuichiro
흠 정말로? 내 여행에서 나는 위의 유창한 예제가'WHERE FirstName + '+ LastName LIKE'% Rog % ''의 T-SQL로 변환 될 것이라고 확신합니다. –
왜 'u => u.FirstName.Contains (query) || u.LastName.Contains (query)'? – haim770