1+ // Remember to use full name because adding new using directives change line numbers
2+ using System . Linq ;
3+
4+ namespace Coverlet . Core . Samples . Tests
5+ {
6+
7+ public class ParentTask_Issue809
8+ {
9+ public int Parent_ID { get ; set ; }
10+ public int Parent_Task { get ; set ; }
11+ public string ParentTaskDescription { get ; set ; }
12+ public System . Collections . Generic . List < Tasks_Issue809 > Tasks { get ; set ; }
13+ }
14+
15+ public class Tasks_Issue809
16+ {
17+ public int TaskId { get ; set ; }
18+ public string TaskDeatails { get ; set ; }
19+ public System . DateTime StartDate { get ; set ; }
20+ public System . DateTime EndDate { get ; set ; }
21+ public int ParentTaskId { get ; set ; }
22+ public int Priortiy { get ; set ; }
23+ public int Status { get ; set ; }
24+
25+ public ParentTask_Issue809 ParentTask { get ; set ; }
26+ }
27+
28+ [ System . Diagnostics . CodeAnalysis . ExcludeFromCodeCoverage ]
29+ public class TaskContext_Issue809
30+ {
31+ public virtual System . Collections . Generic . List < ParentTask_Issue809 > ParentTasks { get ; set ; }
32+ public virtual System . Collections . Generic . List < Tasks_Issue809 > Tasks { get ; set ; }
33+
34+ internal System . Threading . Tasks . Task < int > SaveChangesAsync ( )
35+ {
36+ throw new System . NotImplementedException ( ) ;
37+ }
38+
39+ internal void Update < T > ( T tasks )
40+ {
41+ throw new System . NotImplementedException ( ) ;
42+ }
43+ }
44+
45+ public class SearchMsg_Issue809
46+ {
47+ public int TaskId { get ; set ; } = - 1 ;
48+ public string TaskDescription { get ; set ; }
49+ public int ParentTaskId { get ; set ; } = - 1 ;
50+ public int PriorityFrom { get ; set ; } = - 1 ;
51+ public int PriorityTo { get ; set ; } = - 1 ;
52+ public System . DateTime FromDate { get ; set ; }
53+ public System . DateTime ToDate { get ; set ; }
54+ }
55+
56+ public class TaskRepo_Issue809
57+ {
58+ private readonly TaskContext_Issue809 taskContext = new TaskContext_Issue809 ( ) ;
59+
60+ public System . Collections . Generic . List < Tasks_Issue809 > GetTaskForAllCriteria ( SearchMsg_Issue809 searchMsg )
61+ {
62+ var criteriaPredicate = LinqKit . PredicateBuilder . New < Tasks_Issue809 > ( true ) ;
63+ if ( searchMsg . TaskId > 0 )
64+ criteriaPredicate = criteriaPredicate . And ( tsk => tsk . TaskId == searchMsg . TaskId ) ;
65+ if ( searchMsg . ParentTaskId > 0 )
66+ {
67+ var parentTask = taskContext . ParentTasks . FirstOrDefault (
68+ partask => partask . Parent_Task == searchMsg . ParentTaskId ) ;
69+ var parentId = ( parentTask != default ) ? parentTask . Parent_ID : 0 ;
70+
71+ criteriaPredicate = criteriaPredicate . And ( tsk => tsk . ParentTaskId == parentId ) ;
72+ }
73+
74+ if ( searchMsg . PriorityFrom > 0 )
75+ criteriaPredicate = criteriaPredicate . Or ( tsk => tsk . Priortiy >= searchMsg . PriorityFrom ) ;
76+ if ( searchMsg . PriorityTo > 0 )
77+ criteriaPredicate = criteriaPredicate . Or ( tsk => tsk . Priortiy <= searchMsg . PriorityTo ) ;
78+ if ( searchMsg . FromDate > System . DateTime . MinValue )
79+ criteriaPredicate = criteriaPredicate . And ( tsk => tsk . StartDate == searchMsg . FromDate ) ;
80+ if ( searchMsg . ToDate > System . DateTime . MinValue )
81+ criteriaPredicate = criteriaPredicate . And ( tsk => tsk . EndDate == searchMsg . ToDate ) ;
82+ if ( ! string . IsNullOrWhiteSpace ( searchMsg . TaskDescription ) )
83+ criteriaPredicate = criteriaPredicate . And ( tsk =>
84+ tsk . TaskDeatails . CompareTo ( searchMsg . TaskDescription ) == 0 ) ;
85+
86+ var anyTaskQuery = from taskEntity in taskContext . Tasks . Where ( criteriaPredicate . Compile ( ) )
87+ select taskEntity ;
88+
89+ var tasks = anyTaskQuery . ToList ( ) ;
90+ tasks . ForEach ( task =>
91+ {
92+ if ( task . ParentTaskId > 0 )
93+ {
94+ task . ParentTask = taskContext . ParentTasks . FirstOrDefault ( ) ;
95+
96+ }
97+ } ) ;
98+
99+ return tasks ;
100+
101+ }
102+
103+ public System . Collections . Generic . List < Tasks_Issue809 > GetTaskForAnyCriteria ( SearchMsg_Issue809 searchMsg )
104+ {
105+ var criteriaPredicate = LinqKit . PredicateBuilder . New < Tasks_Issue809 > ( false ) ;
106+ if ( searchMsg . TaskId > 0 )
107+ criteriaPredicate = criteriaPredicate . Or ( tsk => tsk . TaskId == searchMsg . TaskId ) ;
108+ if ( ! string . IsNullOrWhiteSpace ( searchMsg . TaskDescription ) )
109+ criteriaPredicate = criteriaPredicate . Or ( tsk =>
110+ tsk . TaskDeatails . CompareTo ( searchMsg . TaskDescription ) == 0 ) ;
111+ if ( searchMsg . ParentTaskId > 0 )
112+ {
113+ var parentTask = taskContext . ParentTasks . FirstOrDefault (
114+ partask => partask . Parent_Task == searchMsg . ParentTaskId ) ;
115+ var parentId = ( parentTask != default ) ? parentTask . Parent_ID : 0 ;
116+
117+ criteriaPredicate = criteriaPredicate . Or ( tsk => tsk . ParentTaskId == parentId ) ;
118+ }
119+
120+ if ( searchMsg . PriorityFrom > 0 )
121+ criteriaPredicate = criteriaPredicate . Or ( tsk => tsk . Priortiy >= searchMsg . PriorityFrom ) ;
122+ if ( searchMsg . PriorityTo > 0 )
123+ criteriaPredicate = criteriaPredicate . Or ( tsk => tsk . Priortiy <= searchMsg . PriorityTo ) ;
124+ if ( searchMsg . FromDate > System . DateTime . MinValue )
125+ criteriaPredicate = criteriaPredicate . Or ( tsk => tsk . StartDate == searchMsg . FromDate ) ;
126+ if ( searchMsg . ToDate > System . DateTime . MinValue )
127+ criteriaPredicate = criteriaPredicate . Or ( tsk => tsk . EndDate == searchMsg . ToDate ) ;
128+ var anyTaskQuery = from taskEntity in taskContext . Tasks . Where ( criteriaPredicate . Compile ( ) )
129+ select taskEntity ;
130+
131+ var tasks = anyTaskQuery . ToList ( ) ;
132+ tasks . ForEach ( task =>
133+ {
134+ if ( task . ParentTaskId > 0 )
135+ {
136+ task . ParentTask = taskContext . ParentTasks . FirstOrDefault ( ) ;
137+ }
138+ } ) ;
139+
140+ return tasks ;
141+ }
142+ public async System . Threading . Tasks . Task < bool > AddTask ( Tasks_Issue809 tasks )
143+ {
144+ _ = await manageParentTask ( tasks ) ;
145+ taskContext . Tasks . Add ( tasks ) ;
146+ var rowsAffected = await taskContext . SaveChangesAsync ( ) ;
147+ return ( rowsAffected > 0 ) ? true : false ;
148+
149+ }
150+
151+ [ System . Diagnostics . CodeAnalysis . ExcludeFromCodeCoverage ]
152+ public async System . Threading . Tasks . Task < bool > EditTask ( Tasks_Issue809 tasks , int val )
153+ {
154+ if ( val == 10 )
155+ {
156+ return true ;
157+ }
158+ else
159+ {
160+ if ( ( tasks . ParentTask != default ) && ( tasks . ParentTask . Parent_Task == 0 ) )
161+ tasks . ParentTask = null ;
162+
163+ var oldTaskQuery = from taskEntity in taskContext . Tasks . Where ( tsk => tsk . TaskId == tasks . TaskId )
164+ from parTaskEntity in taskContext . ParentTasks . Where ( partask =>
165+ partask . Parent_ID == taskEntity . ParentTaskId ) . DefaultIfEmpty ( )
166+ select new { taskEntity , parTaskEntity } ;
167+ var oldTaskValueObj = oldTaskQuery . FirstOrDefault ( ) ;
168+ var oldTask = oldTaskValueObj . taskEntity ;
169+ if ( oldTaskValueObj . parTaskEntity != default )
170+ {
171+ oldTask . ParentTask = new ParentTask_Issue809
172+ {
173+ Parent_ID = oldTaskValueObj . parTaskEntity . Parent_ID ,
174+ ParentTaskDescription = oldTaskValueObj . parTaskEntity . ParentTaskDescription ,
175+ Parent_Task = oldTaskValueObj . parTaskEntity . Parent_Task
176+ } ;
177+ }
178+
179+
180+ if ( oldTask == default )
181+ throw new System . ApplicationException ( "Task not found" ) ;
182+ if ( ( ( oldTask . ParentTask != null ) && ( oldTask . ParentTask . Parent_ID != tasks . ParentTaskId ) ) ||
183+ ( ( oldTask . ParentTask == default ) && ( tasks . ParentTask != default ) && ( tasks . ParentTask . Parent_Task > 0 ) ) )
184+ _ = await manageParentTask ( tasks ) ;
185+
186+
187+ taskContext . Update < Tasks_Issue809 > ( tasks ) ;
188+ var rowsAffected = await taskContext . SaveChangesAsync ( ) ;
189+
190+ bool combinedResult = ( rowsAffected > 0 ) ? true : false ;
191+ bool parentUpdateResult = await UpdateParentTakDetails ( tasks ) ;
192+ if ( ( combinedResult ) & & ( parentUpdateResult ) )
193+ return true ;
194+ else
195+ return false ;
196+ }
197+ }
198+
199+ private async System . Threading . Tasks . Task < bool > UpdateParentTakDetails ( Tasks_Issue809 task )
200+ {
201+ var parentTask = taskContext . ParentTasks . FirstOrDefault ( parTsk =>
202+ parTsk . Parent_Task == task . ParentTaskId ) ;
203+ if ( ( parentTask != default ) &&
204+ ( parentTask . ParentTaskDescription . CompareTo ( task . TaskDeatails ) != 0 ) )
205+ {
206+ parentTask . ParentTaskDescription = task . TaskDeatails ;
207+ taskContext . Update ( parentTask ) ;
208+ var recordsAffected = await taskContext . SaveChangesAsync ( ) ;
209+ return ( recordsAffected > 0 ) ? true : false ;
210+ }
211+ return true ;
212+
213+ }
214+
215+ private async System . Threading . Tasks . Task < Tasks_Issue809 > manageParentTask ( Tasks_Issue809 task )
216+ {
217+
218+ if ( ( task . ParentTask != null ) && ( task . ParentTask . Parent_Task > 0 ) )
219+ {
220+ ParentTask_Issue809 parentTask = taskContext . ParentTasks . FirstOrDefault ( parTsk =>
221+ parTsk . Parent_Task == task . ParentTaskId ) ;
222+ if ( parentTask == default )
223+ {
224+ var parTaskFromTaskEntity = taskContext . Tasks
225+ . FirstOrDefault ( tsk => tsk . TaskId == task . ParentTaskId ) ;
226+ parentTask = new ParentTask_Issue809
227+ {
228+ Parent_Task = parTaskFromTaskEntity . TaskId ,
229+ ParentTaskDescription = parTaskFromTaskEntity . TaskDeatails
230+ } ;
231+ taskContext . ParentTasks . Add ( parentTask ) ;
232+ await taskContext . SaveChangesAsync ( ) ;
233+
234+ }
235+ else
236+ {
237+ taskContext . Update ( parentTask ) ;
238+ await taskContext . SaveChangesAsync ( ) ;
239+
240+ }
241+
242+ task . ParentTaskId = parentTask . Parent_ID ;
243+ task . ParentTask = parentTask ;
244+ }
245+ else
246+ task . ParentTask = null ;
247+
248+ return task ;
249+ }
250+
251+ public System . Threading . Tasks . Task < System . Collections . Generic . List < ParentTask_Issue809 > > GetAllParentTasks ( )
252+ {
253+ return System . Threading . Tasks . Task . FromResult ( taskContext . ParentTasks . ToList ( ) ) ;
254+ }
255+
256+ [ System . Diagnostics . CodeAnalysis . ExcludeFromCodeCoverage ]
257+ public System . Collections . Generic . List < Tasks_Issue809 > GetAllTasks ( )
258+ {
259+ var taskQuery = from taskEntity in taskContext . Tasks . Where ( tsk => tsk . Status >= 0 )
260+ from parTaskEntity in taskContext . ParentTasks . Where ( partask =>
261+ partask . Parent_ID == taskEntity . ParentTaskId ) . DefaultIfEmpty ( )
262+ select new { taskEntity , parTaskEntity } ;
263+ var taskValueObj = taskQuery . ToList ( ) ;
264+ var tasks = taskValueObj . Select ( valueObj =>
265+ {
266+ if ( valueObj . parTaskEntity != null )
267+ {
268+ valueObj . taskEntity . ParentTask = valueObj . parTaskEntity ;
269+ }
270+ return valueObj . taskEntity ;
271+ } ) . ToList ( ) ;
272+ return tasks ;
273+ }
274+ }
275+ }
0 commit comments