Не уверен, возможно ли это, или я правильно выражаю то, что ищу, но у меня в библиотеке есть следующий фрагмент кода, и я хотел бы попрактиковаться в СУХОЙ.
У меня есть набор таблиц SQL Server, которые я запрашиваю на основе простого пользовательского поля поиска аля Google. Я использую LINQ для составления окончательного запроса на основе того, что в строке поиска. Я ищу способ использовать дженерики и передать лямбда-функции для создания из этого многоразовой подпрограммы:
string[] arrayOfQueryTerms = getsTheArray();
var somequery = from q in dataContext.MyTable
select q;
if (arrayOfQueryTerms.Length == 1)
{
somequery = somequery.Where<MyTableEntity>(
e => e.FieldName.StartsWith(arrayOfQueryTerms[0]));
}
else
{
foreach(string queryTerm in arrayOfQueryTerms)
{
if (!String.IsNullOrEmpty(queryTerm))
{
somequery = somequery
.Where<MyTableEntity>(
e => e.FieldName.Contains(queryTerm));
}
}
}
Я надеялся создать универсальный метод с сигнатурой, который будет выглядеть примерно так:
private IQueryable<T> getQuery(
T MyTableEntity, string[] arrayOfQueryTerms, Func<T, bool> predicate)
Я использую одну и ту же стратегию поиска по всем моим таблицам, поэтому единственное, что действительно отличается от использования к использованию, - это поиск MyTable & MyTableEntity и поиск FieldName. Имеет ли это смысл? Есть ли способ с помощью LINQ динамически передавать имя поля для запроса в предложении where? Или я могу передать это как предикат лямбда?
e => e.FieldName.Contains(queryTerm)
Я понимаю, что существует полтора с половиной способа сделать это в SQL, возможно, проще, но я бы хотел оставить все в семействе LINQ для этого. Кроме того, я чувствую, что генерики должны быть полезны для такой проблемы, как эта. Есть идеи?