כמה שאלות על תכנון DB
-
@dovid אמר בכמה שאלות על תכנון DB:
משהו כזה
SELECT Customers.* FROM Customers LEFT JOIN Shiluv ON Shiluv.Snif = Customers.Snif WHERE Shiluv.Group = @currentUserGroup
תודה רבה!
ואיך אני מקבל באותו משפט את currentUserGroup כשאני יודע רק את ה currentUserID?
במקרה שלא אצליח לדחוף את הUserGroup לזכרון.SELECT Customers.* FROM Customers INNER JOIN Shiluv ON Shiluv.Snif = Customers.Snif INNER JOIN Users ON Users.Group = Shiluv.Group WHERE Users.Id = @currentUserId
או
SELECT Customers.* FROM Customers LEFT JOIN Shiluv ON Shiluv.Snif = Customers.Snif WHERE Shiluv.Group = (SELECT TOP 1 Group FROM Users WHERE Id = @currentUserId)
ייתכן שאני טועה קלות בתחביר אבל זה הרעיון.
-
SELECT Customers.* FROM Customers INNER JOIN Shiluv ON Shiluv.Snif = Customers.Snif INNER JOIN Users ON Users.Group = Shiluv.Group WHERE Users.Id = @currentUserId
או
SELECT Customers.* FROM Customers LEFT JOIN Shiluv ON Shiluv.Snif = Customers.Snif WHERE Shiluv.Group = (SELECT TOP 1 Group FROM Users WHERE Id = @currentUserId)
ייתכן שאני טועה קלות בתחביר אבל זה הרעיון.
@dovid תודה רבה!
למעשה הצלחתי להכניס את המזהה קבוצה לזכרון.אבל יש לי בעיה אחת, בעצם הצלחתי לשלב בטבלת הלקוחות שדה מזהה קבוצה, הבעיה שזה שדה מסוג
List<Int32>
והמזהה קבוצה המקורי הוא מסוג:
Int32?
וכשאני מנסה לסנן אותו:
protected override void ApplyFilters(SqlQuery query) { base.ApplyFilters(query); var user = (UserDefinition)Authorization.UserDefinition; query.Where(user.GroupId == fld.GroupId); }
אני מקבל שגיאה:
Error CS0019 Operator '==' cannot be applied to operands of type 'int?' and 'ListField<int>'
-
-
@dovid אמר בכמה שאלות על תכנון DB:
זה לא
List<Int32>
אלאListField<int>
שזה מחלקה של סרניטי כך שקשה לי לדעת איך "אוכלים" אותה.אם זה היה List<Int32> היה לך פתרון? או שאין כזה דבר..
-
-
@clickone זה לא נראה לי הבעיה, אפשר לנטרל את הספק ע"י עטיפת הuser.GroupId לint רגיל:
query.Where((user.GroupId ?? 0) == fld.GroupId);
(אני מניח שהint? זה הUser.GroupId).
ואני לא מזהה פה את דאפר, אולי הם משתמשים בו אבל ישנם בדרך הפשטות שאני לא יכול לעזור בהם.
-
@clickone זה לא נראה לי הבעיה, אפשר לנטרל את הספק ע"י עטיפת הuser.GroupId לint רגיל:
query.Where((user.GroupId ?? 0) == fld.GroupId);
(אני מניח שהint? זה הUser.GroupId).
ואני לא מזהה פה את דאפר, אולי הם משתמשים בו אבל ישנם בדרך הפשטות שאני לא יכול לעזור בהם.
-
פה https://github.com/volkanceylan/serenity-guide/blob/master/tutorials/multi_tenancy/handling_lookup_scripts.md
נראה שאמורים לעטוף את הערך עם מחלקה בשם Criteria -query.Where(new Criteria(user.GroupId) == fld.GroupId);
-
@dovid אמר בכמה שאלות על תכנון DB:
query.Where(new Criteria(user.GroupId) == fld.GroupId);
הפוך
query.Where(new Criteria(fld.GroupId) == user.GroupId);
@dovid אמר בכמה שאלות על תכנון DB:
הפוך
query.Where(new Criteria(fld.GroupId) == user.GroupId);Error CS0019 Operator '==' cannot be applied to operands of type 'Criteria' and 'int?'
עריכה:
הסתדר ב"ה!
השתמשתי בשילוב של@dovid אמר בכמה שאלות על תכנון DB:
אפשר לנטרל את הספק ע"י עטיפת הuser.GroupId לint רגיל:
query.Where((user.GroupId ?? 0) == fld.GroupId);תודה רבה רבה!
-
אז @clickone צדק. אשמח לראות את השורה הסופית כי לא לגמרי הבנתי את השילוב.
אני באתי להציע לך להיכנע ולכתוב User.GroupId.ToString() -
פה https://github.com/volkanceylan/serenity-guide/blob/master/tutorials/multi_tenancy/handling_lookup_scripts.md
נראה שאמורים לעטוף את הערך עם מחלקה בשם Criteria -query.Where(new Criteria(user.GroupId) == fld.GroupId);
@dovid אמר בכמה שאלות על תכנון DB:
פה https://github.com/volkanceylan/serenity-guide/blob/master/tutorials/multi_tenancy/handling_lookup_scripts.md
נראה שאמורים לעטוף את הערך עם מחלקה בשם Criteria -סליחה.
שחכתי אתמול לכתוב לך התנצלות על זה שרצת לקרוא את ה""תיעוד"" של סרניטי.
אני ממש לא התכוונתי לזה, קראתי לך ול @clickone , כי אתה מבין בSQL וC# (שחדש אצלי לגמרי), ו @clickone מבין בסרניטי (חוץ מהנ"ל).בכל אופן אני עדיין תקוע עם זה, כי זה לא עובד לי בינתיים, כנראה שזה לא אפשרי לסנן את זה בלי ForeignKey מוצהר.
אז כנראה אצטרך להוסיף query.LeftJoin, הבעיה שאני לא מצליח להבין את 3 הפרמטרים שהוא רוצה.
והתיעוד של סרניטי לא קיים... ניכר היטב שזה תוכנה מסחרית עם גירסה חינמית...public SqlQuery Join(Join join); public SqlQuery LeftJoin(IAlias alias, ICriteria onCriteria); public SqlQuery LeftJoin(string toTable, IAlias alias, ICriteria onCriteria); public SqlQuery OrderBy(IAlias alias, string fieldName, bool desc = false);
מה זה ה alias?
עריכה:
namespace Serenity.Data { public interface IAlias { string Name { get; } string NameDot { get; } string Table { get; } } }