powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / IRepository как пользоваться
25 сообщений из 238, страница 7 из 10
IRepository как пользоваться
    #38416382
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУАлексей К"Разруха, она в головах." (ц)
... которые используют IQueryable методы в репозиториях :)У меня вообще нет такого понятия, как репозитарий. :-)
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38416395
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КМСУБред же.Это как посмотреть. IQueryable позволяет на сервере приложений организовать окружение, напоминающее окружение в хранимой процедуре в БД. Например, IQueryable-свойство является аналогом View из T-SQL. Дополнительные возможности - это скорее хорошо чем плохо. Единственный недостаток - надо уметь ими пользоваться.И как им пользоваться? Тот код, что Вы показываете, вызывает вопрос: а зачем тут вообще IQueryable.

И если типа это аналог представления, то сколько у вас таких "представлений"? N + 1?
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38416402
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SerP19832 skyANA и МСУ

Спасибо, понял. Согласен, что IQueryProvider писать не айс; согласен, что для каждого IQueryProvider есть своя специфика и, если отдавать наружу IQueryable, можно словить жопу.

Предлагаю рассмотреть 2 случая:

1) Опять повторюсь, что у devexpress есть возможность работать с гридом асинхронно (подгружать строки при скроле). Для этого надо использовать LinqInstantFeedbackSource,
EntityInstantFeedbackSource, ещечегототамInstantFeedbackSource. При этом код писать практически не надо. Но для InstantFeedbackSource надо указывать Source как IQueryable.

2) Если посмотреть на domainservice (мертвый ria который) или на dataservice (живой OData), то там можно наружу выдавать IQueryable.

Вопрос: мне в этих 2-х случаях отказаться от репозитория и напрямую пользовать контекст или сделать репозиторий с IQueryable?Встречный вопрос: Вы OData пользовались?
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38416411
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУИли ты про кашу IQueryable, которая не пойми что возвращает: в одних случаях это отложенный сиквел запрос с последующей ретрансляцией, в других это просто клиентская коллекция.IQueryable во всех случаях следует рассматривать не как "готовую" коллекцию, а как фрагмент запроса.
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38416413
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAАлексей Кпропущено...
Это как посмотреть. IQueryable позволяет на сервере приложений организовать окружение, напоминающее окружение в хранимой процедуре в БД. Например, IQueryable-свойство является аналогом View из T-SQL. Дополнительные возможности - это скорее хорошо чем плохо. Единственный недостаток - надо уметь ими пользоваться.И как им пользоваться?Если Вы не находите применение такому подходу, наверное, Вам это не надо.
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38416421
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А до появления WebAPI с поддержкой OData у вас был public API? На чём он был написан? Там использовали IQueryable? Если да, то как парсили параметры HTTP запроса, какой формат предоставляли?
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38416427
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAА до появления WebAPI с поддержкой OData у вас был public API? На чём он был написан? Там использовали IQueryable? Если да, то как парсили параметры HTTP запроса, какой формат предоставляли?Если это вопрос мне, то 14914067 .
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38416430
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КМСУпропущено...
... которые используют IQueryable методы в репозиториях :)У меня вообще нет такого понятия, как репозитарий. :-)
Посмотри на название темы. Что тогда ты тут делаешь? :)

Алексей КМСУИли ты про кашу IQueryable, которая не пойми что возвращает: в одних случаях это отложенный сиквел запрос с последующей ретрансляцией, в других это просто клиентская коллекция.IQueryable во всех случаях следует рассматривать не как "готовую" коллекцию, а как фрагмент запроса.
В случае репозитория этот функционал излишен, даже вреден.
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38416432
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, Алексей, тоже хотел поинтересоваться. Вот у тебя сервер приложений на WCF, как я понимаю? Каким байдингом пользуешься, чтобы пробрасывать клиентам IQueryable? )
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38416437
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУАлексей Кпропущено...
У меня вообще нет такого понятия, как репозитарий. :-)
Посмотри на название темы. Что тогда ты тут делаешь? :)Хочешь меня прогнать?

МСУАлексей Кпропущено...
IQueryable во всех случаях следует рассматривать не как "готовую" коллекцию, а как фрагмент запроса.
В случае репозитория этот функционал излишен, даже вреден.В случае IQueryable репозитарий излишен, даже вреден. :-)
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38416438
SerP1983
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2skyANA
В проектах - нет. Самому потыкаться - да.
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38416440
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
О, тролололинг пошёл. А аргументы будут?
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38416441
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУКстати, Алексей, тоже хотел поинтересоваться. Вот у тебя сервер приложений на WCF, как я понимаю? Каким байдингом пользуешься, чтобы пробрасывать клиентам IQueryable? )А 5 25

14914067
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38416444
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAТот код, что Вы показываете, вызывает вопрос: а зачем тут вообще IQueryable.Ну могу дать другой пример.
Не для слабонервных
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
236.
237.
238.
239.
240.
241.
242.
243.
244.
245.
246.
247.
248.
249.
250.
251.
252.
253.
254.
255.
256.
257.
258.
259.
260.
261.
262.
263.
264.
265.
266.
267.
268.
269.
270.
271.
272.
273.
274.
275.
276.
277.
278.
279.
280.
281.
282.
283.
284.
285.
286.
287.
288.
289.
290.
291.
292.
293.
294.
295.
296.
297.
298.
299.
300.
301.
302.
303.
304.
305.
306.
307.
308.
309.
310.
311.
312.
313.
314.
315.
316.
317.
318.
319.
320.
321.
322.
323.
324.
325.
326.
327.
328.
329.
330.
331.
332.
333.
334.
335.
336.
337.
338.
339.
340.
341.
342.
343.
344.
345.
346.
347.
348.
349.
350.
351.
352.
353.
354.
355.
356.
357.
358.
359.
360.
361.
362.
363.
364.
365.
366.
367.
368.
369.
370.
371.
372.
373.
374.
375.
376.
377.
378.
379.
380.
381.
382.
383.
384.
385.
386.
387.
388.
389.
390.
391.
392.
393.
394.
395.
396.
397.
398.
399.
400.
401.
402.
403.
404.
405.
406.
407.
408.
409.
410.
411.
412.
413.
414.
415.
416.
417.
418.
419.
420.
421.
422.
423.
424.
425.
426.
427.
428.
429.
430.
431.
432.
433.
434.
435.
436.
437.
438.
439.
440.
441.
442.
443.
444.
445.
446.
447.
448.
449.
450.
451.
452.
453.
454.
455.
456.
457.
458.
459.
460.
461.
462.
463.
464.
465.
466.
467.
468.
469.
470.
471.
472.
473.
474.
475.
476.
477.
478.
479.
480.
481.
482.
483.
484.
485.
486.
487.
488.
489.
490.
491.
492.
493.
494.
495.
496.
497.
498.
499.
500.
501.
502.
503.
504.
505.
506.
507.
508.
509.
510.
511.
512.
513.
514.
515.
516.
517.
518.
519.
520.
521.
522.
523.
524.
525.
526.
527.
528.
529.
530.
531.
532.
533.
534.
535.
536.
537.
538.
539.
540.
541.
542.
543.
544.
545.
546.
547.
548.
549.
550.
551.
552.
553.
554.
555.
556.
557.
558.
559.
560.
561.
562.
563.
564.
565.
566.
567.
568.
569.
570.
571.
572.
573.
574.
575.
576.
577.
578.
579.
580.
581.
582.
583.
584.
585.
586.
587.
588.
589.
590.
591.
592.
593.
594.
595.
596.
597.
598.
599.
600.
601.
602.
603.
604.
605.
606.
607.
608.
609.
610.
611.
612.
613.
614.
615.
616.
617.
618.
619.
620.
621.
622.
623.
624.
625.
626.
627.
628.
629.
630.
631.
632.
633.
634.
635.
636.
637.
638.
639.
640.
641.
642.
643.
644.
645.
646.
647.
648.
649.
650.
651.
652.
653.
654.
655.
656.
657.
658.
659.
660.
661.
662.
663.
664.
665.
666.
667.
668.
669.
670.
671.
672.
673.
674.
675.
676.
677.
678.
679.
680.
681.
682.
683.
684.
685.
686.
687.
688.
689.
690.
691.
692.
693.
694.
695.
696.
697.
698.
699.
700.
701.
702.
703.
704.
705.
706.
707.
708.
709.
710.
711.
712.
713.
714.
715.
716.
717.
718.
719.
720.
721.
722.
723.
724.
725.
726.
727.
728.
729.
730.
731.
732.
733.
734.
735.
736.
737.
738.
739.
740.
741.
742.
743.
744.
745.
746.
747.
748.
749.
750.
using System; 
using System.Collections.Generic; 
using System.Data.Entity; 
using System.Linq; 
using System.Linq.Expressions; 
using System.Runtime.Serialization; 
using System.Security.Permissions; 
using System.ServiceModel; 
using System.Text; 
using CommonDistributed; 
using CommonServer; 
using DbMain; 
using PersonalServer; 
using SspMain; 
  
namespace MessageServer 
{ 
    [DataContract(Namespace = Wsns.Message)] 
    public class MessageTaskView 
    { 
        [DataMember] 
        public int? ID; 
  
        [DataMember] 
        public string ProjectStr; 
  
        [DataMember] 
        public string Subject; 
  
        [DataMember] 
        public string SenderPersStr; 
  
        [DataMember] 
        public string RecipientPersStr; 
  
        [DataMember] 
        public DateTime? CreateDate; 
  
        [DataMember] 
        public DateTime? ActivityDate; 
  
        [DataMember] 
        public DateTime? PlanCompleteDate; 
  
        [DataMember] 
        public string CurrentStateStr; 
  
        [DataMember] 
        public bool IsSenderMe; 
  
        [DataMember] 
        public bool IsRecipientMe; 
  
        [DataMember] 
        public bool CanChangeMessage; 
  
        [DataMember] 
        public bool MustReadMessage; 
  
        [DataMember] 
        public bool IsTaskNotReaded; 
  
        [DataMember] 
        public bool IsCommentNotReaded; 
  
        [DataMember] 
        public bool IsActive; 
  
        [DataMember] 
        public bool IsPlanCompleteDateExpired; 
  
        [DataMember] 
        public bool HasAttachment; 
    } 
  
    [DataContract(Namespace = Wsns.Message)] 
    public class MessageTaskDetail 
    { 
        // Постановка задачи 
  
        [DataMember] 
        public int? ID; 
  
        [DataMember] 
        public string SenderPersStr; 
  
        [DataMember] 
        public bool IsSenderMe; 
  
        [DataMember] 
        public DateTime? CreateDate;         
  
        [DataMember] 
        public DateTime? LastChangeDate; 
  
        [DataMember] 
        public string LastChangePersStr; 
  
        [DataMember] 
        public bool IsLastChangePersMe;         
  
        // Назначение         
  
        [DataMember] 
        public string ProjectStr; 
  
        [DataMember] 
        public string Subject;         
  
        [DataMember] 
        public string RecipientPersStr; 
  
        [DataMember] 
        public bool IsRecipientMe; 
  
        [DataMember] 
        public DateTime? RecipientReadDate; 
  
        // Выполнение 
  
        [DataMember] 
        public DateTime? PlanCompleteDate; 
  
        [DataMember] 
        public bool IsPlanCompleteDateExpired; 
  
        [DataMember] 
        public DateTime? ActivityDate; 
  
        [DataMember] 
        public string CurrentStateStr; 
  
        [DataMember] 
        public DateTime? CurrentStateDate; 
  
        // Задание 
  
        [DataMember] 
        public string ContentText; 
    } 
  
    [DataContract(Namespace = Wsns.Message)] 
    public class MessageTaskEdit 
    { 
        [DataMember] 
        public int? ID; 
  
        [DataMember] 
        public byte[] TaskTimeS; 
  
        [DataMember] 
        public byte[] MessageTimeS; 
  
        [DataMember] 
        public int? ProjectID; 
  
        [DataMember] 
        public int? RecipientPersID; 
  
        [DataMember] 
        public DateTime? PlanCompleteDate; 
  
        [DataMember] 
        public string Subject; 
  
        [DataMember] 
        public string ContentText; 
    } 
  
    [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)] 
    [ServiceContract(Namespace = Wsns.Message)] 
    public class SvcMessageTask 
    { 
        SvcMessageCore SvcMessageCore = new SvcMessageCore(); 
  
        #region MessageTaskView 
  
        IQueryable<MessageTaskView> GetMessageTaskView(IQueryable<message_task> source) 
        { 
            using (var sc = DbMainFactory.Scope) 
            { 
                return
                    from mt in source 
  
                    let m = mt.ID_Reference                     
                    let sender = m.SenderPersID_Reference 
                    let recipient = m.RecipientPersID_Reference 
                    let currentStateID = SvcMessageTaskCore.GetCurrentStateID.Invoke(mt) 
  
                    join currentState in sc.Content.message_taskStates on currentStateID equals currentState.ID 
  
                    select new MessageTaskView 
                    { 
                        ID = mt.ID,                         
                        ProjectStr = mt.ProjectID_Reference.Caption, 
                        Subject = mt.Subject, 
                        SenderPersStr = SvcPersonalCore.GetShortNameTN.Invoke(sender), 
                        RecipientPersStr = SvcPersonalCore.GetShortNameTN.Invoke(recipient), 
                        CreateDate = m.CreateDate, 
                        ActivityDate = SvcMessageTaskCore.GetActivityDate.Invoke(mt), 
                        PlanCompleteDate = mt.PlanCompleteDate, 
                        CurrentStateStr = currentState.Caption, 
                        IsSenderMe = SvcMessageCore.GetIsSenderMe.Invoke(m), 
                        IsRecipientMe = SvcMessageCore.GetIsRecipientMe.Invoke(m) ?? false, 
                        CanChangeMessage = SvcMessageCore.GetCanChangeMessage.Invoke(m), 
                        MustReadMessage = SvcMessageCore.GetMustReadMessage.Invoke(m) ?? false, 
                        IsTaskNotReaded = SvcMessageCore.GetIsNotReadedMessage.Invoke(m) ?? false, 
  
                        IsCommentNotReaded = 
                            ( 
                                from md in mt.message_comments_TaskID_Reference 
                                let mdm = md.ID_Reference 
                                where SvcMessageCore.GetIsNotReadedMessage.Invoke(mdm).Value 
                                select md 
                            ).Any(), 
  
                        IsActive = SvcMessageTaskCore.GetIsActive.Invoke(mt, currentState), 
  
                        IsPlanCompleteDateExpired = 
                            SvcMessageTaskCore.GetIsPlanCompleteDateExpired.Invoke(mt, currentState), 
  
                        HasAttachment = m.message_attachments_MsgID_Reference.Any() 
                    }; 
            } 
        } 
  
        [OperationContract] 
        public MessageTaskView[] GetMessageTaskViewByEfficientFilter 
        ( 
            int direction, // 0 - Все 1 - Входящие 2 - Исходящие 
            int category // 1 - Непрочитанные 2 - Активные 3 - Недавние 
        ) 
        { 
            if (direction < 0 || direction > 2) 
                throw new ArgumentException("direction"); 
  
            using (var sc = DbMainFactory.Scope) 
            { 
                var q = sc.Content.message_task.Take(0); 
  
                if (category == 1) 
                { 
                    #region Непрочитанные 
  
                    if (direction == 0 || direction == 1) 
                    { 
                        q = q.Concat( 
                            from mt in sc.Content.message_task 
                            let m = mt.ID_Reference 
                            where SvcMessageCore.GetIsNotReadedMessage.Invoke(m).Value 
                            select mt 
                        ); 
  
                        q = q.Concat( 
                            from mt in sc.Content.message_task 
                            let m = mt.ID_Reference 
                            where
                                SvcMessageCore.GetIsRecipientMe.Invoke(m).Value && 
                                ( 
                                    from md in mt.message_comments_TaskID_Reference 
                                    let mdm = md.ID_Reference 
                                    where SvcMessageCore.GetIsNotReadedMessage.Invoke(mdm).Value 
                                    select md 
                                ).Any() 
                            select mt 
                        ); 
                    } 
  
                    if (direction == 0 || direction == 2) 
                    { 
                        q = q.Concat( 
                            from mt in sc.Content.message_task 
                            let m = mt.ID_Reference 
                            where
                                SvcMessageCore.GetIsSenderMe.Invoke(m) && 
                                ( 
                                    from md in mt.message_comments_TaskID_Reference 
                                    let mdm = md.ID_Reference 
                                    where SvcMessageCore.GetIsNotReadedMessage.Invoke(mdm).Value 
                                    select md 
                                ).Any() 
                            select mt 
                        ); 
                    } 
  
                    if (direction == 0) 
                    { 
                        q = q.Concat( 
                            from mt in sc.Content.message_task 
                            where
                                ( 
                                    from md in mt.message_comments_TaskID_Reference 
                                    let mdm = md.ID_Reference 
                                    where SvcMessageCore.GetIsNotReadedMessage.Invoke(mdm).Value 
                                    select md 
                                ).Any() 
                            select mt 
                        ); 
                    } 
  
                    #endregion 
                } 
                else if (category == 2) 
                { 
                    #region Активные 
  
                    var protectDateFrom = DbDateTime.Now.AddDays(-365); 
  
                    if (direction == 0 || direction == 1) 
                    { 
                        q = q.Concat( 
                            from mt in sc.Content.message_task 
                            let m = mt.ID_Reference 
                            let currentStateID = SvcMessageTaskCore.GetCurrentStateID.Invoke(mt) 
                            join currentState in sc.Content.message_taskStates on currentStateID equals currentState.ID 
                            where
                                SvcMessageCore.GetIsRecipientMe.Invoke(m).Value && 
                                m.CreateDate >= protectDateFrom && 
                                SvcMessageTaskCore.GetIsActive.Invoke(mt, currentState) 
                            select mt 
                        ); 
                    } 
  
                    if (direction == 0 || direction == 2) 
                    { 
                        q = q.Concat( 
                            from mt in sc.Content.message_task 
                            let m = mt.ID_Reference 
                            let currentStateID = SvcMessageTaskCore.GetCurrentStateID.Invoke(mt) 
                            join currentState in sc.Content.message_taskStates on currentStateID equals currentState.ID 
                            where
                                SvcMessageCore.GetIsSenderMe.Invoke(m) && 
                                m.CreateDate >= protectDateFrom && 
                                SvcMessageTaskCore.GetIsActive.Invoke(mt, currentState) 
                            select mt 
                        ); 
                    } 
  
                    #endregion 
                } 
                else if (category == 3) 
                { 
                    #region Недавние 
  
                    var recentDateFrom = DbDateTime.Now.AddDays(-30); 
  
                    if (direction == 0 || direction == 1) 
                    { 
                        q = q.Concat( 
                            from mt in sc.Content.message_task 
                            let m = mt.ID_Reference 
                            where
                                SvcMessageCore.GetIsRecipientMe.Invoke(m).Value && 
                                m.CreateDate >= recentDateFrom 
                            select mt 
                        ); 
  
                        q = q.Concat( 
                            from mt in sc.Content.message_task 
                            let m = mt.ID_Reference 
                            where
                                SvcMessageCore.GetIsRecipientMe.Invoke(m).Value && 
                                ( 
                                    from md in mt.message_comments_TaskID_Reference 
                                    where md.ID_Reference.CreateDate >= recentDateFrom 
                                    select md 
                                ).Any() 
                            select mt 
                        ); 
                    } 
  
                    if (direction == 0 || direction == 2) 
                    { 
                        q = q.Concat( 
                            from mt in sc.Content.message_task 
                            let m = mt.ID_Reference 
                            where
                                SvcMessageCore.GetIsSenderMe.Invoke(m) && 
                                m.CreateDate >= recentDateFrom 
                            select mt 
                        ); 
  
                        q = q.Concat( 
                            from mt in sc.Content.message_task 
                            let m = mt.ID_Reference 
                            where
                                SvcMessageCore.GetIsSenderMe.Invoke(m) && 
                                ( 
                                    from md in mt.message_comments_TaskID_Reference 
                                    where md.ID_Reference.CreateDate >= recentDateFrom 
                                    select md 
                                ).Any() 
                            select mt 
                        ); 
                    } 
  
                    if (direction == 0) 
                    { 
                        q = q.Concat( 
                            from mt in sc.Content.message_task 
                            where
                                ( 
                                    from md in mt.message_comments_TaskID_Reference 
                                    let mdm = md.ID_Reference 
                                    where
                                        SvcMessageCore.GetIsSenderMe.Invoke(mdm) && 
                                        mdm.CreateDate >= recentDateFrom 
                                    select md 
                                ).Any() 
                            select mt 
                        ); 
  
                        q = q.Concat( 
                            from mt in sc.Content.message_task 
                            where
                                ( 
                                    from md in mt.message_comments_TaskID_Reference 
                                    let mdm = md.ID_Reference 
                                    where
                                        SvcMessageCore.GetIsRecipientMe.Invoke(mdm).Value && 
                                        mdm.CreateDate >= recentDateFrom 
                                    select md 
                                ).Any() 
                            select mt 
                        ); 
                    } 
  
                    #endregion 
                } 
                else
                    throw new ArgumentException("category"); 
  
                return GetMessageTaskView(q.Distinct()).ToArray(); 
            } 
        } 
  
        [OperationContract] 
        public MessageTaskView[] GetMessageTaskViewByFavID(int favID) 
        { 
            using (var sc = DbMainFactory.Scope) 
            { 
                var q = 
                    from mt in sc.Content.message_task 
                    from mtf in mt.message_taskToFavorite_TaskID_Reference 
                    where mtf.FavID == favID 
                    select mt; 
  
                return GetMessageTaskView(q).ToArray(); 
            } 
        } 
  
        [OperationContract] 
        public MessageTaskView GetMessageTaskViewByID(int id) 
        { 
            using (var sc = DbMainFactory.Scope) 
            { 
                var q = sc.Content.message_task.Where(mt => mt.ID == id); 
                return GetMessageTaskView(q).FirstOrDefault(); 
            } 
        } 
  
        [OperationContract] 
        public MessageTaskView[] GetMessageTaskViewByExtendedFilter 
        ( 
            DateTime t1, DateTime t2, int projectID,  
            int? senderPersID, int? recipientPersID, string subject, 
            int[] stateID 
        ) 
        { 
            if
            ( 
                string.IsNullOrWhiteSpace(subject) && 
                senderPersID.HasValue == false && 
                recipientPersID.HasValue == false
            ) 
                return null; 
  
            t1 = t1.Date; 
            t2 = t2.Date.AddDays(1); 
            stateID = stateID ?? new int[0]; 
  
            using (var sc = DbMainFactory.Scope) 
            { 
                var q = 
                    from mt in sc.Content.message_task 
                    let m = mt.ID_Reference 
                    let currentStateID = SvcMessageTaskCore.GetCurrentStateID.Invoke(mt) 
                    where m.CreateDate >= t1 && m.CreateDate < t2 && stateID.Contains(currentStateID.Value) 
                    select new { m, mt }; 
  
                if (senderPersID.HasValue) 
                    q = q.Where(s => s.m.SenderPersID == senderPersID); 
  
                if (recipientPersID.HasValue) 
                    q = q.Where(s => s.m.RecipientPersID == recipientPersID); 
  
                if (string.IsNullOrWhiteSpace(subject) == false) 
                    q = q.Where(s => s.mt.Subject.Contains(subject)); 
  
                if (projectID > 0) 
                    q = q.Where(s => s.mt.ProjectID == projectID); 
  
                return GetMessageTaskView(q.Select(s => s.mt)).ToArray(); 
            } 
        } 
  
        #endregion 
  
        #region MessageTaskDetail 
  
        [OperationContract] 
        public MessageTaskDetail GetMessageTaskDetailByID(int id) 
        { 
            using (var sc = DbMainFactory.Scope) 
            { 
                var q = 
                    from mt in sc.Content.message_task 
                    where mt.ID == id 
  
                    let m = mt.ID_Reference 
                    let sender = m.SenderPersID_Reference 
                    let recipient = m.RecipientPersID_Reference 
                    let lastChangePers = m.LastChangePersID_Reference 
                    let currentStateID = SvcMessageTaskCore.GetCurrentStateID.Invoke(mt) 
  
                    join currentState in sc.Content.message_taskStates on currentStateID equals currentState.ID 
  
                    select new MessageTaskDetail 
                    { 
                        ID = mt.ID, 
                        SenderPersStr = SvcPersonalCore.GetFullNameTN.Invoke(sender), 
                        IsSenderMe = SvcMessageCore.GetIsSenderMe.Invoke(m), 
                        CreateDate = m.CreateDate,                         
                        LastChangeDate = m.LastChangeDate, 
                        LastChangePersStr = SvcPersonalCore.GetFullNameTN.Invoke(lastChangePers), 
                        IsLastChangePersMe = SvcMessageCore.GetIsLastChangePersMe.Invoke(m) ?? false,                         
  
                        ProjectStr = mt.ProjectID_Reference.Caption, 
                        Subject = mt.Subject, 
                        RecipientPersStr = SvcPersonalCore.GetFullNameTN.Invoke(recipient), 
                        IsRecipientMe = SvcMessageCore.GetIsRecipientMe.Invoke(m) ?? false, 
                        RecipientReadDate = m.RecipientReadDate, 
  
                        PlanCompleteDate = mt.PlanCompleteDate, 
                        IsPlanCompleteDateExpired = SvcMessageTaskCore.GetIsPlanCompleteDateExpired.Invoke(mt, currentState), 
                        ActivityDate = SvcMessageTaskCore.GetActivityDate.Invoke(mt), 
                        CurrentStateStr = currentState.Caption, 
                        CurrentStateDate = SvcMessageTaskCore.GetCurrentStateDate.Invoke(mt), 
  
                        ContentText = m.ContentText 
                    }; 
  
                return q.First(); 
            } 
        } 
  
        [OperationContract] 
        public bool GetCanUserChangeTaskStateByID(int taskID) 
        { 
            using (var sc = DbMainFactory.Scope) 
            { 
                var task = 
                    ( 
                        from mt in sc.Content.message_task 
                        where mt.ID == taskID 
                        let m = mt.ID_Reference 
                        select new
                        { 
                            SenderPersID = m.SenderPersID, 
                            RecipientPersID = m.RecipientPersID 
                        } 
                    ) 
                    .First(); 
  
                var persID = UserContext.PersID; 
  
                return task.SenderPersID == persID || task.RecipientPersID == persID; 
            } 
        } 
  
        [OperationContract] 
        public ClassifierItem[] GetTaskFavoritesByID(int taskID) 
        { 
            using (var sc = DbMainFactory.Scope) 
            { 
                var q = 
                    from mtf in sc.Content.message_taskToFavorite 
                    let f = mtf.FavID_Reference 
                    where
                        mtf.TaskID == taskID && 
                        f.PersID == UserContext.PersID 
                    orderby f.Caption 
                    select new ClassifierItem 
                    { 
                        ID = f.ID, 
                        Caption = f.Caption 
                    }; 
  
                return q.ToArray(); 
            } 
        } 
  
        #endregion 
  
        #region MessageTaskEdit 
  
        [OperationContract] 
        public MessageTaskEdit GetMessageTaskEditNew() 
        { 
            return new MessageTaskEdit(); 
        } 
  
        [OperationContract] 
        public MessageTaskEdit GetMessageTaskEditByID(int id) 
        { 
            using (var sc = DbMainFactory.Scope) 
            { 
                var q = 
                    from mt in sc.Content.message_task 
                    where mt.ID == id 
                    let m = mt.ID_Reference 
                    select new MessageTaskEdit 
                    { 
                        ID = mt.ID, 
                        TaskTimeS = mt.TimeS, 
                        MessageTimeS = m.TimeS, 
                        ProjectID = mt.ProjectID, 
                        RecipientPersID = m.RecipientPersID, 
                        PlanCompleteDate = mt.PlanCompleteDate, 
                        Subject = mt.Subject, 
                        ContentText = m.ContentText 
                    }; 
  
                return q.First(); 
            } 
        } 
  
        [OperationContract] 
        [PrincipalPermission(SecurityAction.Demand, Role = Roles.message_task)] 
        public int SaveMessageTask(MessageTaskEdit item, UpdateAction action) 
        { 
            using (var sc = DbMainFactory.Scope) 
            { 
                message message; 
                message_task message_task; 
  
                if (action == UpdateAction.Insert) 
                { 
                    message = SvcMessageCore.CreateMessage(); 
                    sc.Content.AttachAsAdded(message); 
                    message.ID = -1; 
  
                    message_task = new message_task(); 
                    sc.Content.AttachAsAdded(message_task); 
                    message_task.ID = message.ID; 
                } 
                else
                { 
                    SvcMessageCore.ValidateCanChangeMessageByID(item.ID.Value); 
  
                    message = sc.Content.message.Where(m => m.ID == item.ID).First(); 
                    message_task = sc.Content.message_task.Where(mt => mt.ID == item.ID).First(); 
  
                    var messageTimeS = sc.Content.Entry(message).Property(v => v.TimeS); 
                    messageTimeS.OriginalValue = item.MessageTimeS; 
                    messageTimeS.CurrentValue = item.MessageTimeS; 
  
                    var taskTimeS = sc.Content.Entry(message_task).Property(v => v.TimeS); 
                    taskTimeS.OriginalValue = item.TaskTimeS; 
                    taskTimeS.CurrentValue = item.TaskTimeS; 
  
                    SvcMessageCore.SetMessageChanged(message); 
                } 
  
                message.RecipientPersID = item.RecipientPersID; 
                message.ContentText = item.ContentText; 
                message_task.ProjectID = item.ProjectID; 
                message_task.PlanCompleteDate = item.PlanCompleteDate; 
                message_task.Subject = item.Subject; 
  
                sc.Content.SaveChanges(); 
                return message.ID.Value; 
            } 
        } 
  
        [OperationContract] 
        [PrincipalPermission(SecurityAction.Demand, Role = Roles.message_task_delete)] 
        public void DeleteMessageTaskByID(int id) 
        { 
            using (var sc = DbMainFactory.Scope) 
            using (new DbContextNoDetectChangesScope(sc.Content)) 
            { 
                SvcMessageCore.ValidateCanChangeMessageByID(id); 
  
                var qDeleteData = 
                    from mt in sc.Content.message_task 
                    where mt.ID == id 
                    select new
                    { 
                        Task = mt, 
                        TaskMessage = mt.ID_Reference, 
                        Comments = 
                            from comment in mt.message_comments_TaskID_Reference 
                            select new
                            { 
                                Comment = comment, 
                                CommentMessage = comment.ID_Reference 
                            }, 
                        Favorites = mt.message_taskToFavorite_TaskID_Reference 
                    }; 
  
                var deleteData = qDeleteData.First(); 
  
                sc.Content.AttachManyAsDeleted(deleteData.Comments.Select(d => d.Comment)); 
                sc.Content.AttachManyAsDeleted(deleteData.Comments.Select(d => d.CommentMessage)); 
                sc.Content.AttachManyAsDeleted(deleteData.Favorites); 
                sc.Content.AttachAsDeleted(deleteData.Task); 
                sc.Content.AttachAsDeleted(deleteData.TaskMessage); 
  
                sc.Content.SaveChanges(); 
            } 
        } 
  
        #endregion 
  
        #region Nsi 
  
        [OperationContract] 
        public ClassifierItem[] GetMessageTaskProjects() 
        { 
            using (var sc = DbMainFactory.Scope) 
                return sc.Content.projects 
                    .Select(p => new ClassifierItem { ID = p.ID, Caption = p.Caption }) 
                    .OrderBy(p => p.Caption) 
                    .ToArray(); 
        } 
  
        [OperationContract] 
        public ClassifierItem[] GetMessageTaskAllStates() 
        { 
            using (var sc = DbMainFactory.Scope) 
                return sc.Content.message_taskStates 
                    .Select(p => new ClassifierItem { ID = p.ID, Caption = p.Caption }) 
                    .OrderBy(p => p.ID) 
                    .ToArray(); 
        } 
  
        #endregion 
    } 
}

...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38416446
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КХочешь меня прогнать?
Ну что ты, просто хочу огородить тебя от общества неофитов, которые читают эти злые сообщения про рульность IQueryable :)

Алексей КВ случае IQueryable репозитарий излишен, даже вреден. :-)
Отлично. То есть репозиторий есть зло? Приехали...

Алексей КМСУКстати, Алексей, тоже хотел поинтересоваться. Вот у тебя сервер приложений на WCF, как я понимаю? Каким байдингом пользуешься, чтобы пробрасывать клиентам IQueryable? )А 5 25

14914067
Подожи подожи, мне кажется ты сейчас уходишь от ответа :) Ответь прямо без гавноссылок - какую технологию и какой механизм привязки ты используешь, чтобы пробрасывать IQueryable с сервера приложений? Вопрос понятен, Лёша? )
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38416448
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КНу могу дать другой пример. Не для слабонервных
И где тут IQueryable для клиентов? :)
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38416454
SerP1983
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУКстати, Алексей, тоже хотел поинтересоваться. Вот у тебя сервер приложений на WCF, как я понимаю? Каким байдингом пользуешься, чтобы пробрасывать клиентам IQueryable? )

А разве есть что-то стандартное? (bltoolkit не предлагать)
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38416456
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КМСУТо есть у тебя все запросы вида "SELECT * FROM"?
В форму редактирования уходит объект, сгенерированный по таблице из базы.

Алексей
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
        [OperationContract] 
        public ClassifierItem[] GetMessageTaskProjects() 
        { 
            using (var sc = DbMainFactory.Scope) 
                return sc.Content.projects 
                    .Select(p => new ClassifierItem { ID = p.ID, Caption = p.Caption }) 
                    .OrderBy(p => p.Caption) 
                    .ToArray(); 
        } 
  
        [OperationContract] 
        public ClassifierItem[] GetMessageTaskAllStates() 
        { 
            using (var sc = DbMainFactory.Scope) 
                return sc.Content.message_taskStates 
                    .Select(p => new ClassifierItem { ID = p.ID, Caption = p.Caption }) 
                    .OrderBy(p => p.ID) 
                    .ToArray(); 
        } 



Божественно :)
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38416458
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУАлексей КХочешь меня прогнать?
Ну что ты, просто хочу огородить тебя от общества неофитов, которые читают эти злые сообщения про рульность IQueryable :)Спасибо за заботу, приятно. :-)

МСУАлексей КВ случае IQueryable репозитарий излишен, даже вреден. :-)
Отлично. То есть репозиторий есть зло? Приехали...Я бы не был столь категоричен. Ограничусь тем, что в текущих проектах мне он не нужен. :-)

МСУПодожи подожи, мне кажется ты сейчас уходишь от ответа :) Ответь прямо без гавноссылок - какую технологию и какой механизм привязки ты используешь, чтобы пробрасывать IQueryable с сервера приложений? Вопрос понятен, Лёша? )Никакую. :-)

Я не отдаю IQueryable на клиента. На клиента уходит готовая коллекция. Я говорю только про внутреннее устройство логики на сервере приложений.
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38416463
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SerP1983МСУКстати, Алексей, тоже хотел поинтересоваться. Вот у тебя сервер приложений на WCF, как я понимаю? Каким байдингом пользуешься, чтобы пробрасывать клиентам IQueryable? )
А разве есть что-то стандартное? (bltoolkit не предлагать)
Причем тут ORM? Речь о байдингах. Например, вот OData New IQueryable Support for Http Services in WCF

Код: c#
1.
2.
3.
4.
5.
6.
[WebGet(UriTemplate = "")]
[QueryComposition]
public IEnumerable<Contact> Get()
{
    return contacts.AsQueryable();
}



Код: c#
1.
IQueryable<Contact> contacts = client.CreateQuery<Contact>().Where(c => c.Name == "First Contact");



Но у Алексея какое-то своё курево. Либо он нас жестко троллит :)
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38416464
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КНикакую. :-)
Я не отдаю IQueryable на клиента. На клиента уходит готовая коллекция. Я говорю только про внутреннее устройство логики на сервере приложений.
Ты ж моё солнце, а как же N+1 в твоём SOA сервисе?
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38416466
SerP1983
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2МСУ
Я не про orm, я про это Linq over WCF
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38416474
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУАлексей КНикакую. :-)
Я не отдаю IQueryable на клиента. На клиента уходит готовая коллекция. Я говорю только про внутреннее устройство логики на сервере приложений.
Ты ж моё солнце, а как же N+1 в твоём SOA сервисе? Ну вот, опять... Вся логика крутится внутри одного сервера приложений. Про SOA я не говорил.
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38416475
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей, а как же ThreadStatic + счётчик ссылок? Где оно тут у тебя?

Алексей КЧтобы избежать нежелательных распределённых транзакций и иметь возможность возвращать из методов IQueryable, временем жизни контекста лучше управлять через ThreadStatic + счётчик ссылок.
...
Рейтинг: 0 / 0
IRepository как пользоваться
    #38416481
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУАлексей, а как же ThreadStatic + счётчик ссылок? Где оно тут у тебя?

Алексей КЧтобы избежать нежелательных распределённых транзакций и иметь возможность возвращать из методов IQueryable, временем жизни контекста лучше управлять через ThreadStatic + счётчик ссылок.
Код: c#
1.
2.
3.
4.
using (var sc = DbMainFactory.Scope) // <== тут
{
    var а = sc.Content.MyTable.ToArray();
}
...
Рейтинг: 0 / 0
25 сообщений из 238, страница 7 из 10
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / IRepository как пользоваться
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]