כמה שאלות על תכנון DB
-
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>'
-
-
@clickone זה לא נראה לי הבעיה, אפשר לנטרל את הספק ע"י עטיפת הuser.GroupId לint רגיל:
query.Where((user.GroupId ?? 0) == fld.GroupId);
(אני מניח שהint? זה ה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);תודה רבה רבה!
-
@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; } } }