0
나는 하나의 호출에서 다음의 세 가지 수행하는 방법을 알아내는 힘든 시간을 보내고있어이 int32 : 수행 할Linq에 동적 필드 포함하고
- 사용 .Contains 메소드를 "LIKE 나는 그것에 .Contains을 할 수 있도록 "내 SQL 서버
- 에 대한 작업은 ((
- 그렇게 SqlFunctions.StringConvert 같은 것을 사용하여, 사용자가 사용자 정의 필드 이름을 전달할 수 있도록 문자열로 INT32에서 값을 변환 double) d.ID) .Contains (idSearch)가 작동하지 않습니다. 나는 내가 어떤 열을 검사 할 것인지 전혀 모른다.
바람직하게는, 나는 같은 것을 할 싶습니다
public static class LinqExtensions
{
public static IQueryable<T> Like<T>(this IQueryable<T> source, string fieldName, object value)
{
... Code here
}
}
를 내가이 처리하는 식 트리를 사용할 필요가 있다고 생각,하지만 난 정말 힘든 시간을 어떤 자습서를 찾는 데있어 동적 Linq/표현식 트리를 사용하는 방법. 어떤 아이디어 나 링크를 통해 나를 도와 주시면 감사하겠습니다. 또는 이미이 작업을 수행하는 라이브러리가있는 사람이라면 더 좋을 것입니다. 좋아
public static class LinqExtensions
{
public static IQueryable<T> Like<T>(this IQueryable<T> source, string propertyName, object value)
{
IQueryable<T> returnQuery = null;
switch (value.GetType().ToString())
{
case "System.String":
returnQuery = source.Where(LikeLambdaString<T>(propertyName, value.ToString()));
break;
default:
returnQuery = source.Where(LikeLambdaDouble<T>(propertyName, Convert.ToDouble(value)));
break;
}
return returnQuery;
}
public static Expression<Func<T, bool>> LikeLambdaString<T>(string propertyName, string value)
{
var linqParam = Expression.Parameter(typeof(T), propertyName);
var linqProp = GetProperty<T>(linqParam, propertyName);
var containsFunc = Expression.Call(linqProp,
typeof(string).GetMethod("Contains"),
new Expression[] { Expression.Constant(value) });
return Expression.Lambda<Func<T, bool>>(containsFunc,
new ParameterExpression[] { linqParam });
}
public static Expression<Func<T, bool>> LikeLambdaDouble<T>(string propertyName, double? value)
{
string stringValue = (value == null) ? string.Empty : value.ToString();
var linqParam = Expression.Parameter(typeof(T), propertyName);
var linqProp = GetProperty<T>(linqParam, propertyName);
var stringConvertMethodInfo =
typeof(SqlFunctions).GetMethod("StringConvert", new Type[] { typeof(double?) });
var stringContainsMethodInfo =
typeof(String).GetMethod("Contains");
return Expression.Lambda<Func<T, bool>>(
Expression.Call(Expression.Call(
stringConvertMethodInfo,
Expression.Convert(
linqProp,
typeof(double?))),
stringContainsMethodInfo,
Expression.Constant(stringValue)),
linqParam);
}
public static MemberExpression GetProperty<T>(ParameterExpression linqParam, string propertyName)
{
List<string> propertyNames = propertyName.Split('.').ToList();
var linqProp = Expression.Property(linqParam, propertyNames[0]);
for (int i = 1; i < propertyNames.Count(); i++)
{
linqProp = Expression.Property(linqProp, propertyNames[i]);
}
return linqProp;
}
}
을 당신이 그것을 부를 것이다 : :
returnQuery = returnQuery.Like("ID", doubleValue);
다음