1

이 질문에는 이미 답변이 있습니다.

다음 람다 식을 고려하십시오.

IQueryable<Product> query = query.Where(x => x.ProductName.Contains("P100"));

위 코드를 다음과 같이 변환해야합니다.

IQueryable<Product> query = query.Where(x => x.GetPropertyValue("ProductName").Contains("P100"));

여기에 더미 메소드가 추가되었습니다.GetPropertyValue("ProductName")요구 사항을 설명합니다. 위의 코드에서 속성은 런타임에 해결되어야합니다. 다른 말로하면 스팅 값 Eg에서 속성에 액세스해야합니다."ProductName"

어떻게해야합니까?


  • 나는이 방법을보다 일반적인 것으로 만들어야한다는 것을 의미한다. 내 응용 프로그램 논리에 따르면 난 단지 문자열 값으로 속성 이름을 가지고. 그래서 문자열을 속성으로 해결해야합니다. - Rahul
  • 귀하의 쿼리 프로세서는 무엇입니까? 심지어는GetPropertyValue()방법Product목적? 지원되지 않는 경우 전환을 수행 할 필요가 없습니다. - Jeff Mercado
  • Linq 표현식을 배우거나 Dynamic Linq를 사용해야합니다. - Aron
  • @DavidG Reflection을 사용하면 대부분의 Linq Provider에서 작동하지 않는다는 점을 감안할 때이 질문과는 완전히 다른 질문입니다. - Aron

2 답변


5

var parameterExp = Expression.Parameter(typeof(Product), "type");
var propertyExp = Expression.Property(parameterExp, propertyName);
MethodInfo method = typeof(string).GetMethod("Contains", new[] { typeof(string) });
var someValue = Expression.Constant(propertyValue, typeof(string));
var containsMethodExp = Expression.Call(propertyExp, method, someValue);

Expression<Func<Product, bool>> predicate = Expression.Lambda<Func<T, bool>>
             (containsMethodExp, parameterExp);


var query = query.Where(predicate);


  • 이것을 쉽게 linq에 전송할 수 있습니까?where포함 된 비트없이 호출? - Douglas Gaskell
  • @DouglasGaskell 포함 된 비트가 없다면 무엇을 의미합니까? 위의 코드는 CLR이없는 순수한 Linq 표현 트리를 생성하는 코드입니다. 이 쿼리는 EF 나 nHiberate와 같은 CLR이 지원되지 않는 공급자를 포함하여 대부분의 Linq Provider에서 실행할 수 있습니다. - Aron

0

이 확장 방법을 사용할 수 있습니다.

public static T GetPropertyValue<T>(this Product product, string propName)
{
   return (T)typeof(Product).GetProperty(propName).GetValue(product, null);
}

그때:

IQueryable<Product> query = query.Where(x => x.GetPropertyValue<string>("ProductName").Contains("P100"));

이 방법은 Entity Framework에서 데이터베이스를 쿼리하는 데 사용할 수 없지만 엔티티 프레임 워크로 질문에 태그를 지정하지 않았으므로 사용하고 있다고 가정하지는 않습니다


  • Odata 클라이언트 코드 생성기와 함께 Odata V4를 사용하고 있습니다. 이게 효과가 있니? - Rahul
  • 나는 그것을 사용하지 않았지만, 모르겠다. 그러나 질문과 관련이있는 경우 (그리고 그 질문과 관련이 있다면) 질문을 지정해야한다. - Jcl

연결된 질문


관련된 질문

최근 질문