Модераторы: gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> как добавить к условию 
:(
    Опции темы
Juriy5
Дата 5.5.2011, 17:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 5.5.2011

Репутация: нет
Всего: нет



Здравствуйте, не могу допереть как сделать. Пишу диплом, использую LINQ.

У меня запрос к источнику, и есть условие.
Условие может быть одно или два, ЕСЛИ введено чтото в textBOX.

Например:
var find =
                   from Cl in Clients                  
                   where   ////?????????????????????????????????                                               
                   select  Cl ;

если упростить вопрос, то подскажить как сделать так, что бы если 
bool B - истина , то условие скадем было такое :
               
                   where   (Cl.NameClient =="Денис" )  &&  (Cl.Id  ==3 )                                                 
    
а если B==fase , то такое
       where   (Cl.NameClient =="Денис" )  

Т.е. В зависимости от переменных 
Я голову сломал, с LINQ не работал раньше. 


PM MAIL   Вверх
WarHog
Дата 5.5.2011, 18:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 122
Регистрация: 20.10.2007
Где: Воронеж

Репутация: 1
Всего: 2



привет,

в простейшем случае достаточно такого
Код

from cl in Clients
where B ? ((cl.NameClient == "Денис") && (cl.Id == 3)) : (cl.NameClient == "Денис")
select p;

--------------------
PM MAIL   Вверх
jonie
Дата 5.5.2011, 20:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: нет
Всего: 118



или можно использовать predicatebuilder [http://www.albahari.com/nutshell/predicatebuilder.aspx] или попросту как вам указали, ну или нечто вроде
Код

var q = from ...select ....;
if(some) q = q.Where(...);
..



--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
Juriy5
Дата 6.5.2011, 00:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 5.5.2011

Репутация: нет
Всего: нет




Цитата(WarHog @  5.5.2011,  18:58 Найти цитируемый пост)
привет,в простейшем случае достаточно такогокод C#1:2:3:from cl in Clientswhere B ? ((cl.NameClient == "Денис") && (cl.Id == 3)) : (cl.NameClient == "Денис")select p;


Я так уже пробывал, вот какой запрос к базе генерируется, мне то надо на уровне программы, а не отправлять СУБД такую штуку


Код

SELECT [t0].[id] AS [Id], [t0].[nameClient] AS [NameClient], [t0].[sotrudnik_id] AS [Sotrudnik_id]   ,..
FROM [dbo].[Client] AS [t0]
WHERE (
    (CASE 
        WHEN @p0 = 1 THEN 
            (CASE 
                WHEN ([t0].[nameClient] = @p1) AND ([t0].[id] = @p2) THEN 1
                WHEN NOT (([t0].[nameClient] = @p1) AND ([t0].[id] = @p2)) THEN 0
                ELSE NULL
             END)
        ELSE 
            (CASE 
                WHEN [t0].[nameClient] = @p3 THEN 1
                WHEN NOT ([t0].[nameClient] = @p3) THEN 0
                ELSE NULL
             END)
     END)) = 1




На самом деле запрос у меня конечно сложнее чем в примере:
Код

var findGroopsawaC2l =
                     from Cl in conn.dc.Client
                     join Ca in conn.dc.Card on Cl.Id equals Ca.CientVidan_Id into tmp
                    where SqlMethods.Like(Cl.NameClient, string.Format("%{0}%", txtClient_FIO.Text))    (<<<<< 1)
                    from t in tmp.DefaultIfEmpty()
                     where
                         SqlMethods.Like(t.NumCard, string.Format("%{0}%", txtClient_Numard.Text))    (<<<<< 2)
                     select new { неважно}


- это сделано левое соединение между таблицами клиент и выданными им карточками  .
Мне надо условие (2) применить если  txtClient_Numard.text != string.Empty,    если Empty, то без него - т.е. и без where


 
Блин, без LINQ было бы в 100 раз проще, просто строку собирать. А здесь одно левое соединение чего стоит

Цитата(jonie @  5.5.2011,  20:47 Найти цитируемый пост)
или можно использовать predicatebuilder [http://www.albahari.com/nutshell/predicatebuilder.aspx] или попросту как вам указали, ну или нечто вродекод C#1:2:3:var q = from ...select ....;if(some) q = q.Where(...);..


Сейчас почитаю, если можно маленький примерчик, чтоб в зависимости от 'B' исключить, или подключить условие





PM MAIL   Вверх
Juriy5
Дата 6.5.2011, 00:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 5.5.2011

Репутация: нет
Всего: нет



или подскажите плиз, как с помощью предикатов, если вот такой запрос:

Код

var find2 =
                     from Cl in conn.dc.Client
                     join Ca in conn.dc.Card on Cl.Id equals Ca.CientVidan_Id into Cards
                     select new { Cl.NameClient, Cl.Id, cardsssss = Cards};     // ну или      Cl , Cards
                

                //Фильтрую по клиентам
                find2 = find2.Where(Ob => Ob.NameClient == "Путин");                               <<   (A1)

                
                if (B)
              {
                //Фильтрую по карточкам ???? КАК???
 
              } 


- Левое соединеник Клиенты - Карточки с группировкой.
т.е. в cardsssss будут содержатся выданные карточки для каждого клиента
Вопрос - как добавить фильтр по карточкам - т.е., Если у путина нет карточки c таким то id , то вся строчка исключается








PM MAIL   Вверх
Juriy5
Дата 6.5.2011, 01:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 5.5.2011

Репутация: нет
Всего: нет



Кажись допер, вот так работает: 


Код


var find2 =
                     from Cl in conn.dc.Client
                     join Ca in conn.dc.Card on Cl.Id equals Ca.CientVidan_Id into Cards                   
                     select new { Cl.NameClient, Cl.Id,Cards };     
                

                //Фильтрую по клиентам
                find2 = find2.Where(Ob => Ob.NameClient == "Путин");    
                
                if (B)   //По карточкам
              {                   
                          find2=  find2.Where(
                        Ob => Ob.Cards.Any(  X=>  X.NumCard=="12"  )   )    ///   !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 
              } 



Но код SQL генерится уж очень ужасный, хотя и работает.

(в случае по обоим условиям)
Код

{SELECT [t0].[nameClient] AS [NameClient], [t0].[id] AS [Id], [t1].[id] AS [Id2], [t1].[numCard] AS [NumCard], [t1].[cientVidan_Id] AS [CientVidan_Id], (
    SELECT COUNT(*)
    FROM [dbo].[Card] AS [t3]
    WHERE [t0].[id] = [t3].[cientVidan_Id]
    ) AS [value]
FROM [dbo].[Client] AS [t0]
LEFT OUTER JOIN [dbo].[Card] AS [t1] ON [t0].[id] = [t1].[cientVidan_Id]
WHERE (EXISTS(
    SELECT NULL AS [EMPTY]
    FROM [dbo].[Card] AS [t2]
    WHERE ([t2].[numCard] = @p0) AND ([t0].[id] = [t2].[cientVidan_Id])
    )) AND ([t0].[nameClient] = @p1)
ORDER BY [t0].[id], [t1].[id]
}



Просто ужас, как проще то можно?





Это сообщение отредактировал(а) Juriy5 - 6.5.2011, 02:02
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | LINQ (Language-Integrated Query) | Следующая тема »


 




[ Время генерации скрипта: 0.0448 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.