Cách dễ dàng
Chỉ cần sử dụng
if (comparison == ComparisonType.StartsWith)
query = query.Where(e => e.StringProperty.StartsWith("SearchString"));
else if ...
Cách cứng
Nếu bạn muốn làm một cái gì đó như thế này, hoặc là đảm bảo cung cấp LINQ của bạn có thể được thông báo của phương pháp mới này bằng cách nào đó, và làm thế nào nó dịch sang SQL (không), hoặc ngăn chặn phương pháp của bạn từ bao giờ đạt đến nhà cung cấp LINQ, và cung cấp cho nhà cung cấp một cái gì đó nó hiểu (ha rd). Ví dụ, thay vì
query.Where(e => CompMethod(e.StringProperty, "SearchString", comparsionType))
bạn có thể tạo một cái gì đó giống như
var query = source.WhereLike(e => e.StringProperty, "SearchString", comparsionType)
với đoạn mã sau
public enum ComparisonType { StartsWith, EndsWith, Contains }
public static class QueryableExtensions
{
public static IQueryable<T> WhereLike<T>(
this IQueryable<T> source,
Expression<Func<T, string>> field,
string value,
SelectedComparisonType comparisonType)
{
ParameterExpression p = field.Parameters[0];
return source.Where(
Expression.Lambda<Func<T, bool>>(
Expression.Call(
field.Body,
comparisonType.ToString(),
null,
Expression.Constant(value)),
p));
}
}
Bạn thậm chí có thể thêm tiêu chí bổ sung theo cách này
var query = from e in source.WhereLike(
e => e.StringProperty, "SearchString", comparsionType)
where e.OtherProperty == 123
orderby e.StringProperty
select e;
Cách rất, rất khó khăn
Nó sẽ (kỹ thuật) có thể viết lại cây biểu trước các nhà cung cấp nhìn thấy nó, vì vậy bạn thể sử dụng truy vấn mà bạn đã có trong tâm trí ở nơi đầu tiên, nhưng bạn' d phải
- tạo
Where(this IQueryable<EntityType> source, Expression<Func<EntityType, bool>> predicate)
để đánh chặn các Queryable.Where
,
- viết lại cây biểu thức, thay thế
CompMethod
của bạn, bất cứ nơi nào nó là, với một trong những phương pháp String
,
- gọi số
Queryable.Where
gốc với biểu thức viết lại,
- và trước hết, có thể thực hiện theo phương pháp tiện ích mở rộng ở trên ngay từ đầu!
Nhưng đó có thể là cách quá phức tạp đối với những gì bạn nghĩ.
Ruben: Hiện tượng, đó là một địa ngục của một lời giải thích - đầy đủ, dễ hiểu, kỹ lưỡng và chính xác những gì tôi đang tìm kiếm, cảm ơn bạn. Tôi cũng muốn cảm ơn người khác vì sự giúp đỡ của họ. –