עבודה עם שאילתת insert

כלליים

New member
grouping

ORM לא בנוי לשאילתות סיכום. למשל: אי אפשר לקבץ מכירות לפי חודש.
 

כלליים

New member
הנה דוגמא

var sales = from t in Transactions group t by new DateTime(t.StatusTime.Year, t.StatusTime.Month, 1) into g
select new
{ month = g.Key, price = g.Sum(x => x.BuyerPrice) };


הORM לא יכול להעביר את הgroupBy לשרת.
אפשר למשוך את כל הרשומות [ToList] ואז לקבץ, אבל כאשר יש אלפי טרנזקציות, או מיליונים, זה לא אפשרי.

ועוד, נתקלתי במקרים שבהם משום מה הORM [של טלריק] החליט לעשות בפרינג ומשך את כל הרשומות, במקום לבנות SQL.

ולכן לדעתי כדאי באופן עקבי להעביר את כל שאילתות הBI לצד השרת.
 

Royi Namir

New member
לא מבין מה אתה אומר

כשאתה מריץ(!) את השאילתה , זה בדיוק כאילו רשמת אותה והרצת אותה ב SQL
&nbsp
http://i.stack.imgur.com/gSJSK.jpg
&nbsp
אתה עושה TOLIST כשאתה רוצה את הנתונים עכשיו - ולא כשאתה מתחיל לעשות ENUMERATION.
&nbsp
 

כלליים

New member
קרא נא שוב את דברי

אני יודע שORM יודע לייצר גם group by.
אבל הבאתי דוגמא ספציפית למשימה טריוויאלית: סיכום מכירות ברמה חודשית.
קדימה. נראה אותך מצליח.
 

כלליים

New member
אכן

אתה צודק, וזה אפשרי אבל בשני שלבים, כמו בקוד דלהלן.
var sales = from trans in context.Transactions group trans by new { trans.StatusTime.Year, trans.StatusTime.Month } into g
select new
{ key = g.Key, price = g.Sum(x => x.BuyerPrice) };var salesByMonth = from sale in sales.ToArray() select new { month = new DateTime(sale.key.Year, sale.key.Month, 1), sales = sale.price };

וכאן תבוא הבעיה השניה שציינתי, שאני לא סומך על הORM שיידע תמיד לבנות את הSQL, כי נתקלתי בבעיות.
למשל, אם יש למשתמש כמה פילטרים שהוא יכול לסנן לפיהם את התוצאות.
IQueryable<Transactions> query = context.Transactions;if(filterByProduct.HasValue)
{
query = query.Where(x => x.productID == filterByProduct.Value);}
צריך להיות, וכך זה בדרך כלל, שיווצר משפט אחד של SQL שיעבור לשרת.
אבל קרו לי כמה פעמים שהORM [של טלריק] התבלבל, והחליט להריץ את השאילתה בלי הפרמטר ולטעון לזכרון את כל הטרנזקציות [מיליוני רשומות!], ואז לפלטר את הרשומות שבזכרון.
 

Royi Namir

New member
כמה דברים


זה שדברים לא עובדים לבן אדם , לא אומר שזו העובדה הסופית -שאי שאפשר.
משפט כמו :
* "משימה טריוויאלית: סיכום מכירות ברמה חודשית.קדימה. נראה אותך מצליח."
לא לעניין , לא מקצועי (לדעתי האישית), בייחוד לאור העובדה שזה אפשרי והראתי את זה.

לגבי התשובה :
לא ברור לי למה שמת 2 שלבים .
אני מניח שרצית לפשט את השאילתה. ( וזה בסדר גמור).
ברגע שהיית מתחיל לעשות ENUMARATION - זה היה מביא נתונים מה DB.

* לגבי - "שאני לא סומך על הORM שיידע תמיד לבנות את הSQL, " ---- תחליף ORM אם זה ככה.
אני לעולם לא נתקלתי בזה בבעיה שכזו.
יחד עם זאת אני חייב לציין שכן נתקלתי בבעיות שאם עושים "==" זה לא יעבוד ו EQUALS כן יעבוד.

* לגבי "קרו לי כמה פעמים שהORM [של טלריק] התבלבל, והחליט להריץ את השאילתה בלי הפרמטר ולטעון לזכרון את כל הטרנזקציות [מיליוני רשומות!]," ----
כנראה משו שם בדרך ( או אתה) קיבל את הנתונים כ IENUMERABLE ולא כ IQUERYABLE ולכן זה קרה.


אני לא משתמש ב TELERIK ולכן אין לי מושג לגבי עניין זה.
 

כלליים

New member
הסיבה שעשיתי בשני שלבים

זו הסיבה שחשבתי שהדבר בלתי אפשרי, עד שבעקבות דבריך מצאתי דרך לוותר על הקונסטרוקטור בשלב הראשון.

 

Royi Namir

New member
פיתרון זריז שעולה לי בראש :

זה להכניס את ה INTS
וב PROPERTY אחר לקבל DATETIME
אפילו עדיף כי הוא לא יצטרך להרכיב את ה DATETIME באינומרציה.....כלומר הוא ירכיב אותו רק(!!!!) כשתקרא את MYDATE.
&nbsp
http://i.imgur.com/2pkgKjR.png
&nbsp
&nbsp
 

arik23m

New member
אני לא חושב כך

אני חושב שSQL צריך לשכון בתוך הSQL
JS צריך לשכון בתוך הJS
HTML בתוך הHTML
וC# בתוך הC#
לפחות באפליקציית ווב ASP.NET
כל עיקום של הכללים האלה יוצר קוד לא קריא וקשה לתחזוקה שלא ברור מאיפה משתנה הUI.
כמו שלא מכניסים HTML לתוך הSQL
ככה לא מכניסים SQL לתוך הCS, כל דבר במקום המיועד שלו
&nbsp
וכמובן שזה גם משפיע על קריאות הקוד שאפשר לקרוא מחרוזת שלמה של SQL ולא להרכיב מפירורים ושברים בדיבאג בC#.
&nbsp
אבל זה אני, זכותך לחשוב ולבצע דברים אחרת..
ואגב, אני כן חושב שעדיף להתחיל בADO.NET עם SP מאשר לפול ישירות לעולם הORM , כמו שאני חושב שעדיף להבין איך כותבים HTML ולא רק להשתמש בDESIGNER של הVS (כנ"ל בSQL). פשוט יש דברים שטוב שאתה מבין לעשות אותם ואח"כ תתפנק על DESIGNER ושות'
&nbsp
 

Royi Namir

New member
מסכים מאד

אחרי זה מגיעים לראיון עבודה שלא עובד עם ה ORM שאתה מכיר , ואתה מוצא את עצמיך אילם מול שאילתות SQL.
SQL צריך לשכון בתוך ה SQL ( דעתי)
ולא רק ב ASP.

אנשים שוכחים שבשביל לשנות משהו בשאילתה , ב #C , כל ה APPPOOL יורד
זה לא מתאים לעבודה דינאמית של ה REALWORLD
איפה שחשוב פיתרון מהיר ושלא נדבר על PERFORMANCE
כל ORM מוריד PERFORMANCE
ה MINI ORM היחידי ( שהוא לא באמת ORM אבל...) נוא DAPPER של MARC GRAVEL.
 

כלליים

New member
אתה לא צריך לדעת מה סוג השדה

אם כל הענין הוא מתי להוסיף '' ומתי לא, אתה יכול לבדוק האם הערך הוא סטרינג או לא.
או להשתמש בפרמטרים:
SqlCommand cmd = new SqlCommand();
cmd.CommandText = "UPDATE MyTable SET IntColumn = @Parameter1, VarcharColumn = @parameter2";
Cmd.Parameters.AddWithValue("@Parameter1", 25);Cmd.Parameters.AddWithValue("@Parameter2", "abc");
 
למעלה