Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Запрос с неопределенным количеством условий  [new]
bald56rus
Member

Откуда:
Сообщений: 194
Всем привет. есть сущность следующего рода:
public class MillingCutter
    {
        public int Id { get; set; }
        public string Name {get;set;}
        public int ProviderId { get; set; }
        public int OperationId { get; set; }
        public decimal? D { get; set; }
        public decimal? d1 { get; set; }
        public decimal? ap { get; set; }
        public decimal? L { get; set; }
        public decimal? Flute { get; set; }
        public decimal? Ha { get; set; }
        public string Shank { get; set; }
        public decimal? r { get; set; }
        public decimal? H { get; set; }
        public decimal? D2 { get; set; }
        public decimal? l2 { get; set; }
        public decimal? Ta { get; set; }
        public decimal? Rd { get; set; }
        public string Chamfer { get; set; }

        public virtual Provider Provider { get; set; }
        [ForeignKey("OperationId")]
        public virtual OperationType OperationType { get; set; }
    }
не соображу как сделать следующее: пользователю выводить окно для ввода данных(D,d1,ap и т.п.)(это то я как раз догадываюсь как сделать) а вот как фильтровать на основании полученных данных от пользователя не соображу. как сделать условие только на те поля которые пользователь указал, например D=20, L=104
20 дек 14, 13:23    [17027541]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с неопределенным количеством условий  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 21987
n => userD == null || n.D == userD
20 дек 14, 13:27    [17027549]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с неопределенным количеством условий  [new]
Где-то в степи
Member

Откуда: Под Таганрогом
Сообщений: 4328
bald56rus,
безусловно практичней и правильней использовать linq to sql, а выражение формировать в ручную из полученных от пользователя данных.
20 дек 14, 13:39    [17027572]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с неопределенным количеством условий  [new]
bald56rus
Member

Откуда:
Сообщений: 194
Shocker.Pro, я наверно не правильно что то делаю: вот код контрола:
namespace CatalogueInstrument.Controllers
{
    public class DefaultController : Controller
    {
        //
        // GET: /Default/
        private CatalogueInstrumentContext db = new CatalogueInstrumentContext();

        public ActionResult Index()
        {
            decimal? D = 20;
            decimal? d1 = 20;
            decimal? ap = 20;
            decimal? L = 
            var cutters = db.MillingCutters.Where(c=>c.D==null||c.D==D);
            return View(cutters);
        }

    }
}

данный запрос возвращает мне значения где D==null, что я делаю не так!? мне необходимо что бы при наличии D были значения где D=то что ввел пользователь
20 дек 14, 13:50    [17027612]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с неопределенным количеством условий  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 21987
bald56rus
я наверно не правильно что то делаю
да, вы невнимательно смотрите на то, что я написал и не пытаетесь его понять
20 дек 14, 13:59    [17027633]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с неопределенным количеством условий  [new]
bald56rus
Member

Откуда:
Сообщений: 194
может я неправильно вопрос сформулировал. т.е. я ожидаю при отсутсвии значения у параметра что бы он вообще не фигурировал в запросе, введены все 4 параметра запрос выглядит как то так:
decimal? D = 20;
decimal? d1 = 20;
decimal? ap = 20;
decimal? L = 104;
var cutters = from cutter in db.MillingCutters where cutter.D == D && cutter.d1 == d1 && cutter.ap == ap && cutter.L==L select cutter;

иначе например так
decimal? D = 20;
decimal? d1 = 20;
decimal? ap = 20;
decimal? L = null;
var cutters = from cutter in db.MillingCutters where cutter.D == D && cutter.d1 == d1 && cutter.ap == ap;
20 дек 14, 14:01    [17027637]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с неопределенным количеством условий  [new]
bald56rus
Member

Откуда:
Сообщений: 194
Shocker.Pro
bald56rus
я наверно не правильно что то делаю
да, вы невнимательно смотрите на то, что я написал и не пытаетесь его понять

поправте меня: n => userD == null || n.D == userD я это понимаю как userD==null или userD=значение.правильно я понял?
20 дек 14, 14:03    [17027644]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с неопределенным количеством условий  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 21987
То есть либо пользователь не дал значение: userD == null (и тогда вторая часть условия не проверяется), либо поле сущности равно значению, которое указал пользователь
20 дек 14, 14:15    [17027673]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с неопределенным количеством условий  [new]
Где-то в степи
Member

Откуда: Под Таганрогом
Сообщений: 4328
bald56rus,
Уважаемы, остановитесь нести бред из детского сада.
Поднимитесь на уровень выше
Вам надо в гугде набрать - c# convert string to expression
что бы для каждого параметра создать выражение,( есть не плохие тулзы для этого (dynamicexpression))
а потом суммировать что получите в единое выражение
набрать : -C# append expressions
а в конце вставить что получилось в Where и всё..
20 дек 14, 14:20    [17027686]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с неопределенным количеством условий  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 21987
можно и так собрать
IQueryable<MillingCutter> cutters = db.MillingCutters();
if (D != null) cutters = cutters.Where(n => n.D == D);
if ...
EF скомпонует все в единый where
20 дек 14, 15:27    [17027781]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с неопределенным количеством условий  [new]
bald56rus
Member

Откуда:
Сообщений: 194
Shocker.Pro огромное спасибо за конкретный пример.
20 дек 14, 16:23    [17027862]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с неопределенным количеством условий  [new]
bald56rus
Member

Откуда:
Сообщений: 194
Где-то в степи, может для Вас это "детский лепет" а я не знал о таком способе(если бы знал то не спрашивал) и Вам спасибо за источник информации
20 дек 14, 16:26    [17027867]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с неопределенным количеством условий  [new]
Где-то в степи
Member

Откуда: Под Таганрогом
Сообщений: 4328
bald56rus,
модератор, в туториал
using DynamicExpression = System.Linq.Dynamic.DynamicExpression;

namespace DynamicExpr
{
    public class Test
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public decimal Price { get; set; }
       
    }
    class Program
    {
        static readonly List<Test> List = new List<Test> { new Test { Id = 1, Name = "aa", Price = 23 },
            new Test { Id = 2, Name = "bb", Price = 200 }, new Test { Id = 3, Name = "cc", Price = 200 } }; 
        static readonly Dictionary<string,object> WhereDictionary=new Dictionary<string, object>(); 
        private static object Func;

        static void Main(string[] args)
        {
           // WhereDictionary.Add("Id", 2);
           // WhereDictionary.Add("Name", "bb");
            WhereDictionary.Add("Price", 200);
            
            var acc = WhereDictionary.Aggregate<KeyValuePair<string, object>, Expression<Func<Test, bool>>>(null, 
                (current, o) => current.And(ExpressionCore<Test>(o.Key, o.Value)));
            Console.Write(List.Where(acc.Compile()).Count());
            Console.Read();

        }

        public static Expression<Func<T, bool>> ExpressionCore<T>(string namePropery, params object[] valuObjects)
        {
            return DynamicExpression.ParseLambda<T,bool>(namePropery+"= @0", valuObjects);
        }

       
    }

    public static class Helper
    {
         public static Expression<Func<T, bool>> And<T>(this Expression<Func<T, bool>> a, Expression<Func<T, bool>> b)
        {
            if (b != null && a == null)
                return b;
            if (b == null&&a!=null)
               throw new Exception("asshole");
            var p = a.Parameters[0];
            var visitor = new SubstExpressionVisitor();
            visitor.Subst[b.Parameters[0]] = p;
            Expression body = Expression.AndAlso(a.Body, visitor.Visit(b.Body));
            return Expression.Lambda<Func<T, bool>>(body, p);
        }
    }

    internal class SubstExpressionVisitor : ExpressionVisitor
    {
        public Dictionary<Expression, Expression> Subst = new Dictionary<Expression, Expression>();
        protected override Expression VisitParameter(ParameterExpression node)
        {
            Expression newValue;
            return Subst.TryGetValue(node, out newValue) ? newValue : node;
        }
    }
20 дек 14, 16:53    [17027908]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с неопределенным количеством условий  [new]
Где-то в степи
Member

Откуда: Под Таганрогом
Сообщений: 4328
дополнение,
конструкция выше для композиции Where
Очень часто as asp.net
требуется сортировка по списку полей as String
таки:
       public static Expression<Func<T, bool>> ExpressionCoreOrderBy<T>(params object[] propertyName)
        {
            return DynamicExpression.ParseLambda<T, bool>("@0", propertyName);
        }

//сумматор

       public static Expression<Func<T, bool>> Or<T>(this Expression<Func<T, bool>> a, Expression<Func<T, bool>> b)
        {
            if (b != null && a == null)
                return b;

            var p = a.Parameters[0];
            var visitor = new SubstExpressionVisitor();
            visitor.Subst[b.Parameters[0]] = p;
            Expression body = Expression.OrElse(a.Body, visitor.Visit(b.Body));
            return Expression.Lambda<Func<T, bool>>(body, p);
        }
22 дек 14, 12:29    [17033180]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с неопределенным количеством условий  [new]
Алексей К
Member

Откуда: Новосибирск
Сообщений: 13632
Где-то в степи
требуется сортировка по списку полей as String
таки:
Таки Dynamic LINQ.
22 дек 14, 12:38    [17033219]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с неопределенным количеством условий  [new]
Алексей К
Member

Откуда: Новосибирск
Сообщений: 13632
Shocker.Pro
n => userD == null || n.D == userD
Index Seek с этим не дружит.

Предпочитаю:
if (userID.HasValue)
    result = result.Where(v => v.UserID == userID);
22 дек 14, 12:40    [17033231]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с неопределенным количеством условий  [new]
bald56rus
Member

Откуда:
Сообщений: 194
Алексей К
Shocker.Pro
n => userD == null || n.D == userD
Index Seek с этим не дружит.

Предпочитаю:
if (userID.HasValue)
    result = result.Where(v => v.UserID == userID);

сделал так:
public ActionResult Index(MillingCutter Cutter)
        {
            decimal? D = Cutter.D;
            decimal? d1 = Cutter.d1;
            decimal? ap = Cutter.ap;
            decimal? L = Cutter.L;
            IQueryable<MillingCutter> cutters = db.MillingCutters;
            if (D != null) cutters = cutters.Where(c => c.D == D);
            if (d1 != null) cutters = cutters.Where(c => c.d1 == d1);
            if (ap != null) cutters = cutters.Where(c => c.ap == ap);
            if (L != null) cutters = cutters.Where(c => c.L == L);
            return View(cutters);
        }

все работает, не до конца понимаю в чем принципиальная разница между "userID.HasValue" и "D != null" на сколько я понял в обоих случаях сравнение с null идет. ну да ладно.спасибо всем откликнувшимся
24 дек 14, 09:24    [17043746]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с неопределенным количеством условий  [new]
МСУ
Member [заблокирован]

Откуда: http://codearticles.ru
Сообщений: 31089
Где-то в степи, а зачем все эти танцы с бубном, если есть старый проверенный System.Linq.Dynamic?
24 дек 14, 09:57    [17043931]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с неопределенным количеством условий  [new]
Алексей К
Member

Откуда: Новосибирск
Сообщений: 13632
bald56rus
не до конца понимаю в чем принципиальная разница между "userID.HasValue" и "D != null" на сколько я понял в обоих случаях сравнение с null идет.
Принципиальной разницы нет.
24 дек 14, 10:01    [17043959]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с неопределенным количеством условий  [new]
Алексей К
Member

Откуда: Новосибирск
Сообщений: 13632
МСУ
Где-то в степи, а зачем все эти танцы с бубном, если есть старый проверенный System.Linq.Dynamic?
Ну хочется. Может оно у него медленно работает, таки строки приходится парсить.
24 дек 14, 10:02    [17043972]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с неопределенным количеством условий  [new]
МСУ
Member [заблокирован]

Откуда: http://codearticles.ru
Сообщений: 31089
По вот этому рецепту http://codearticles.ru/articles/2544

Что может быть проще?

var l = list.Where("Price == @0", 200);
24 дек 14, 10:04    [17043992]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с неопределенным количеством условий  [new]
МСУ
Member [заблокирован]

Откуда: http://codearticles.ru
Сообщений: 31089
Алексей К
Ну хочется. Может оно у него медленно работает, таки строки приходится парсить.

Так он делает тоже самое через DynamicExpression.ParseLambda :)
24 дек 14, 10:05    [17044008]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с неопределенным количеством условий  [new]
Алексей К
Member

Откуда: Новосибирск
Сообщений: 13632
МСУ
Алексей К
Ну хочется. Может оно у него медленно работает, таки строки приходится парсить.

Так он делает тоже самое через DynamicExpression.ParseLambda :)
Ну тогда не знаю. Бог ему судья.
24 дек 14, 10:07    [17044029]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с неопределенным количеством условий  [new]
МСУ
Member [заблокирован]

Откуда: http://codearticles.ru
Сообщений: 31089
Где-то в степи такой Где-то в степи
24 дек 14, 10:09    [17044036]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с неопределенным количеством условий  [new]
Где-то в степи
Member

Откуда: Под Таганрогом
Сообщений: 4328
МСУ,
ну не ужели не понятно, что ПЕРЕМЕННОЕ число параметров, там основной акцент не на динамик, а на ADD
24 дек 14, 10:44    [17044305]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM Ответить