Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 2 3 4 5 6 [7] 8 9 10   вперед  Ctrl      все
 Re: IRepository как пользоваться  [new]
Алексей К
Member

Откуда: Новосибирск
Сообщений: 13632
МСУ
Алексей К
"Разруха, она в головах." (ц)

... которые используют IQueryable методы в репозиториях :)
У меня вообще нет такого понятия, как репозитарий. :-)
4 окт 13, 10:01    [14922097]     Ответить | Цитировать Сообщить модератору
 Re: IRepository как пользоваться  [new]
skyANA
Member

Откуда: Зеленоград
Сообщений: 28166
Алексей К
МСУ
Бред же.
Это как посмотреть. IQueryable позволяет на сервере приложений организовать окружение, напоминающее окружение в хранимой процедуре в БД. Например, IQueryable-свойство является аналогом View из T-SQL. Дополнительные возможности - это скорее хорошо чем плохо. Единственный недостаток - надо уметь ими пользоваться.
И как им пользоваться? Тот код, что Вы показываете, вызывает вопрос: а зачем тут вообще IQueryable.

И если типа это аналог представления, то сколько у вас таких "представлений"? N + 1?
4 окт 13, 10:09    [14922155]     Ответить | Цитировать Сообщить модератору
 Re: IRepository как пользоваться  [new]
skyANA
Member

Откуда: Зеленоград
Сообщений: 28166
SerP1983
2 skyANA и МСУ

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

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

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

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

Вопрос: мне в этих 2-х случаях отказаться от репозитория и напрямую пользовать контекст или сделать репозиторий с IQueryable?
Встречный вопрос: Вы OData пользовались?
4 окт 13, 10:14    [14922191]     Ответить | Цитировать Сообщить модератору
 Re: IRepository как пользоваться  [new]
Алексей К
Member

Откуда: Новосибирск
Сообщений: 13632
МСУ
Или ты про кашу IQueryable, которая не пойми что возвращает: в одних случаях это отложенный сиквел запрос с последующей ретрансляцией, в других это просто клиентская коллекция.
IQueryable во всех случаях следует рассматривать не как "готовую" коллекцию, а как фрагмент запроса.
4 окт 13, 10:18    [14922218]     Ответить | Цитировать Сообщить модератору
 Re: IRepository как пользоваться  [new]
Алексей К
Member

Откуда: Новосибирск
Сообщений: 13632
skyANA
Алексей К
пропущено...
Это как посмотреть. IQueryable позволяет на сервере приложений организовать окружение, напоминающее окружение в хранимой процедуре в БД. Например, IQueryable-свойство является аналогом View из T-SQL. Дополнительные возможности - это скорее хорошо чем плохо. Единственный недостаток - надо уметь ими пользоваться.
И как им пользоваться?
Если Вы не находите применение такому подходу, наверное, Вам это не надо.
4 окт 13, 10:20    [14922230]     Ответить | Цитировать Сообщить модератору
 Re: IRepository как пользоваться  [new]
skyANA
Member

Откуда: Зеленоград
Сообщений: 28166
А до появления WebAPI с поддержкой OData у вас был public API? На чём он был написан? Там использовали IQueryable? Если да, то как парсили параметры HTTP запроса, какой формат предоставляли?
4 окт 13, 10:25    [14922270]     Ответить | Цитировать Сообщить модератору
 Re: IRepository как пользоваться  [new]
Алексей К
Member

Откуда: Новосибирск
Сообщений: 13632
skyANA
А до появления WebAPI с поддержкой OData у вас был public API? На чём он был написан? Там использовали IQueryable? Если да, то как парсили параметры HTTP запроса, какой формат предоставляли?
Если это вопрос мне, то 14914067.
4 окт 13, 10:29    [14922293]     Ответить | Цитировать Сообщить модератору
 Re: IRepository как пользоваться  [new]
МСУ
Member [заблокирован]

Откуда: http://codearticles.ru
Сообщений: 31089
Алексей К
МСУ
пропущено...
... которые используют IQueryable методы в репозиториях :)
У меня вообще нет такого понятия, как репозитарий. :-)

Посмотри на название темы. Что тогда ты тут делаешь? :)

Алексей К
МСУ
Или ты про кашу IQueryable, которая не пойми что возвращает: в одних случаях это отложенный сиквел запрос с последующей ретрансляцией, в других это просто клиентская коллекция.
IQueryable во всех случаях следует рассматривать не как "готовую" коллекцию, а как фрагмент запроса.

В случае репозитория этот функционал излишен, даже вреден.
4 окт 13, 10:30    [14922297]     Ответить | Цитировать Сообщить модератору
 Re: IRepository как пользоваться  [new]
МСУ
Member [заблокирован]

Откуда: http://codearticles.ru
Сообщений: 31089
Кстати, Алексей, тоже хотел поинтересоваться. Вот у тебя сервер приложений на WCF, как я понимаю? Каким байдингом пользуешься, чтобы пробрасывать клиентам IQueryable? )
4 окт 13, 10:32    [14922311]     Ответить | Цитировать Сообщить модератору
 Re: IRepository как пользоваться  [new]
Алексей К
Member

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

Посмотри на название темы. Что тогда ты тут делаешь? :)
Хочешь меня прогнать?

МСУ
Алексей К
пропущено...
IQueryable во всех случаях следует рассматривать не как "готовую" коллекцию, а как фрагмент запроса.

В случае репозитория этот функционал излишен, даже вреден.
В случае IQueryable репозитарий излишен, даже вреден. :-)
4 окт 13, 10:36    [14922338]     Ответить | Цитировать Сообщить модератору
 Re: IRepository как пользоваться  [new]
SerP1983
Member

Откуда: с Волги
Сообщений: 846
2skyANA
В проектах - нет. Самому потыкаться - да.
4 окт 13, 10:37    [14922343]     Ответить | Цитировать Сообщить модератору
 Re: IRepository как пользоваться  [new]
skyANA
Member

Откуда: Зеленоград
Сообщений: 28166
О, тролололинг пошёл. А аргументы будут?
4 окт 13, 10:38    [14922349]     Ответить | Цитировать Сообщить модератору
 Re: IRepository как пользоваться  [new]
Алексей К
Member

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

14914067
4 окт 13, 10:38    [14922351]     Ответить | Цитировать Сообщить модератору
 Re: IRepository как пользоваться  [new]
Алексей К
Member

Откуда: Новосибирск
Сообщений: 13632
skyANA
Тот код, что Вы показываете, вызывает вопрос: а зачем тут вообще IQueryable.
Ну могу дать другой пример.
+ Не для слабонервных
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 
    } 
}
4 окт 13, 10:42    [14922373]     Ответить | Цитировать Сообщить модератору
 Re: IRepository как пользоваться  [new]
МСУ
Member [заблокирован]

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

Ну что ты, просто хочу огородить тебя от общества неофитов, которые читают эти злые сообщения про рульность IQueryable :)

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

Отлично. То есть репозиторий есть зло? Приехали...

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

14914067

Подожи подожи, мне кажется ты сейчас уходишь от ответа :) Ответь прямо без гавноссылок - какую технологию и какой механизм привязки ты используешь, чтобы пробрасывать IQueryable с сервера приложений? Вопрос понятен, Лёша? )
4 окт 13, 10:43    [14922380]     Ответить | Цитировать Сообщить модератору
 Re: IRepository как пользоваться  [new]
МСУ
Member [заблокирован]

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

И где тут IQueryable для клиентов? :)
4 окт 13, 10:44    [14922388]     Ответить | Цитировать Сообщить модератору
 Re: IRepository как пользоваться  [new]
SerP1983
Member

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


А разве есть что-то стандартное? (bltoolkit не предлагать)
4 окт 13, 10:47    [14922418]     Ответить | Цитировать Сообщить модератору
 Re: IRepository как пользоваться  [new]
МСУ
Member [заблокирован]

Откуда: http://codearticles.ru
Сообщений: 31089
Алексей К
МСУ
То есть у тебя все запросы вида "SELECT * FROM"? Картинка с другого сайта.
В форму редактирования уходит объект, сгенерированный по таблице из базы.


Алексей
        [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(); 
        } 


Божественно :)
4 окт 13, 10:48    [14922422]     Ответить | Цитировать Сообщить модератору
 Re: IRepository как пользоваться  [new]
Алексей К
Member

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

Ну что ты, просто хочу огородить тебя от общества неофитов, которые читают эти злые сообщения про рульность IQueryable :)
Спасибо за заботу, приятно. :-)

МСУ
Алексей К
В случае IQueryable репозитарий излишен, даже вреден. :-)

Отлично. То есть репозиторий есть зло? Приехали...
Я бы не был столь категоричен. Ограничусь тем, что в текущих проектах мне он не нужен. :-)

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

Я не отдаю IQueryable на клиента. На клиента уходит готовая коллекция. Я говорю только про внутреннее устройство логики на сервере приложений.
4 окт 13, 10:49    [14922428]     Ответить | Цитировать Сообщить модератору
 Re: IRepository как пользоваться  [new]
МСУ
Member [заблокирован]

Откуда: http://codearticles.ru
Сообщений: 31089
SerP1983
МСУ
Кстати, Алексей, тоже хотел поинтересоваться. Вот у тебя сервер приложений на WCF, как я понимаю? Каким байдингом пользуешься, чтобы пробрасывать клиентам IQueryable? )

А разве есть что-то стандартное? (bltoolkit не предлагать)

Причем тут ORM? Речь о байдингах. Например, вот OData New IQueryable Support for Http Services in WCF

[WebGet(UriTemplate = "")]
[QueryComposition]
public IEnumerable<Contact> Get()
{
    return contacts.AsQueryable();
}


IQueryable<Contact> contacts = client.CreateQuery<Contact>().Where(c => c.Name == "First Contact");


Но у Алексея какое-то своё курево. Либо он нас жестко троллит :)
4 окт 13, 10:50    [14922441]     Ответить | Цитировать Сообщить модератору
 Re: IRepository как пользоваться  [new]
МСУ
Member [заблокирован]

Откуда: http://codearticles.ru
Сообщений: 31089
Алексей К
Никакую. :-)
Я не отдаю IQueryable на клиента. На клиента уходит готовая коллекция. Я говорю только про внутреннее устройство логики на сервере приложений.

Ты ж моё солнце, а как же N+1 в твоём SOA сервисе?
4 окт 13, 10:52    [14922447]     Ответить | Цитировать Сообщить модератору
 Re: IRepository как пользоваться  [new]
SerP1983
Member

Откуда: с Волги
Сообщений: 846
2МСУ
Я не про orm, я про это Linq over WCF
4 окт 13, 10:54    [14922460]     Ответить | Цитировать Сообщить модератору
 Re: IRepository как пользоваться  [new]
Алексей К
Member

Откуда: Новосибирск
Сообщений: 13632
МСУ
Алексей К
Никакую. :-)
Я не отдаю IQueryable на клиента. На клиента уходит готовая коллекция. Я говорю только про внутреннее устройство логики на сервере приложений.

Ты ж моё солнце, а как же N+1 в твоём SOA сервисе?
Ну вот, опять... Вся логика крутится внутри одного сервера приложений. Про SOA я не говорил.
4 окт 13, 10:56    [14922481]     Ответить | Цитировать Сообщить модератору
 Re: IRepository как пользоваться  [new]
МСУ
Member [заблокирован]

Откуда: http://codearticles.ru
Сообщений: 31089
Алексей, а как же ThreadStatic + счётчик ссылок? Где оно тут у тебя?

Алексей К
Чтобы избежать нежелательных распределённых транзакций и иметь возможность возвращать из методов IQueryable, временем жизни контекста лучше управлять через ThreadStatic + счётчик ссылок.
4 окт 13, 10:57    [14922487]     Ответить | Цитировать Сообщить модератору
 Re: IRepository как пользоваться  [new]
Алексей К
Member

Откуда: Новосибирск
Сообщений: 13632
МСУ
Алексей, а как же ThreadStatic + счётчик ссылок? Где оно тут у тебя?

Алексей К
Чтобы избежать нежелательных распределённых транзакций и иметь возможность возвращать из методов IQueryable, временем жизни контекста лучше управлять через ThreadStatic + счётчик ссылок.

using (var sc = DbMainFactory.Scope) // <== тут
{
    var а = sc.Content.MyTable.ToArray();
}
4 окт 13, 11:00    [14922510]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 2 3 4 5 6 [7] 8 9 10   вперед  Ctrl      все
Все форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM Ответить