Лично, разрабатывая веб-сайт, который является базирующейся производительностью интенсивного трафика, я избегаю транзакций базы данных, когда это возможно. Очевидно, они необходимы, таким образом, я использую ORM и переменные объекта уровня страницы для уменьшения количества серверных вызовов, я должен сделать.
Вложенные транзакции являются потрясающим способом минимизировать Ваши вызовы, я держусь в том направлении каждый раз, когда я могу, пока они - быстрые запросы та блокировка причины привычки. NHibernate был спасителем в этих случаях.
Вы можете провести рефакторинг некоторых частей кода, создав метод расширения. Что-то вроде этого:
static class QueryableExtensions
{
private static MethodInfo StringContainsMethod;
private static MethodInfo StringStartsWithMethod;
static QueryableExtensions()
{
Type[] singleStringParam = new[] {typeof(string)};
StringContainsMethod = typeof(string).GetMethod("Contains", singleStringParam);
StringStartsWithMethod = typeof(string).GetMethod("StartsWith", singleStringParam);
}
public static IQueryable<T> AppendTextFilter<T>(this IQueryable<T> queryable, Expression<Func<T, string>> memberSelector, string condition, string value)
{
Expression expression = null;
switch (condition)
{
case "StartsWith":
expression = Expression.Call(
memberSelector.Body,
StringStartsWithMethod,
Expression.Constant(value));
break;
case "Equals":
expression = Expression.Equal(
memberSelector.Body,
Expression.Constant(value));
break;
case "Contains":
expression = Expression.Call(
memberSelector.Body,
StringContainsMethod,
Expression.Constant(value));
break;
default:
throw new NotSupportedException(string.Format("'{0}' is not a supported condition", condition));
}
var lambda = Expression.Lambda<Func<T, bool>>(
expression,
memberSelector.Parameters);
return queryable.Where(lambda);
}
}
Вы могли бы затем использовать это так:
var claims = db.Claims
.AppendTextFilter(c => c.companyFileID, ddlSearchField.Text, txtSearchBox.Text)
.AppendTextFilter(c => c.someOtherProperty, ddlOtherSearchField.Text, txtOtherSearchBox.Text)
...;
Have you tried dynamic LINQ? It allows you to build string-based query statements similar to a SQL WHERE clause.
You could make a dictionary of your possible predicates:
Dictionary<string, Func<string, Expression<Func<Claim, bool>>>> map = new Dictionary<string, Func<string, Expression<Func<Claim, bool>>>>() {
{ "StartsWith", t => c => c.companyFileID.StartsWith(t) },
{ "Equals", t => c => c.companyFileID == t },
{ "Contains", t => c => c.companyFileID.Contains(t) }
};
Which could be used like this:
var search = ddlSearchField.Text;
var text = txtSearchBox.Text;
var claims = from c in db.Claims select c;
Func<string, Expression<Func<Claim, bool>>> predicate = null;
if(dict.TryGetValue(search, out predicate))
claims = claims.Where(predicate(text));