ASP.NET ищет форму - динамический Linq к SQL?

Лично, разрабатывая веб-сайт, который является базирующейся производительностью интенсивного трафика, я избегаю транзакций базы данных, когда это возможно. Очевидно, они необходимы, таким образом, я использую ORM и переменные объекта уровня страницы для уменьшения количества серверных вызовов, я должен сделать.

Вложенные транзакции являются потрясающим способом минимизировать Ваши вызовы, я держусь в том направлении каждый раз, когда я могу, пока они - быстрые запросы та блокировка причины привычки. NHibernate был спасителем в этих случаях.

5
задан dahlbyk 12 October 2009 в 20:09
поделиться

3 ответа

Вы можете провести рефакторинг некоторых частей кода, создав метод расширения. Что-то вроде этого:

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)
             ...;
3
ответ дан 15 December 2019 в 06:29
поделиться

Have you tried dynamic LINQ? It allows you to build string-based query statements similar to a SQL WHERE clause.

http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx

0
ответ дан 15 December 2019 в 06:29
поделиться

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));
0
ответ дан 15 December 2019 в 06:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: