none
שליפת שם לפי ID RRS feed

  • שאלה

  • שלום לכולם,

    כאשר כתבתי את הקוד הבא :

     var db = new Entities();
                var res = from x
                                 in db.webS
                          where x.ID == id
                          select x.Name.ToList();
                return res.ToString();

    קיבלתי את הנתון : 

    System.Data.Objects.ObjectQuery`1[System.Collections.Generic.List`1[System.Char]]

    במקום את שם האדם. למה זה קורה? תודה!

    • הועבר על-ידי pituachMVP, Moderator יום ראשון 17 אוגוסט 2014 15:24 שאלה שאינה קשורה ל SQL Server, תועבר לפורום המתאים
    שבת 16 אוגוסט 2014 12:24

תשובות

  • תנסי להפעיל את המתודה FIRST בזמן השימוש ולא בזמן הבחירה למשל. משהו כזה:

    DataClasses1DataContext db = new DataClasses1DataContext();
    var res = from u in db.Orders select u.Number; // here we get a list of object
    Console.WriteLine(String.Format("query: {0}", res.First().ToString()));

    קשה לי לנחש בלי לראות את כל הקוד הקשור לבעיה אבל מהתוצאות שלך כניראה שזה יעבד בשבילך (הפורמט של הקוד טוב ובדקתי אותו כרגע בפועל).

    דרך נוספת היא כך:

    DataClasses1DataContext db = new DataClasses1DataContext();
    var res = db.Orders.First().Number;
    Console.WriteLine(String.Format("query: {0}", res.ToString()));


    [Personal Site] [Blog] [Facebook]signature


    • נערך על-ידי pituachMVP, Moderator יום ראשון 17 אוגוסט 2014 13:29
    • סומן כתשובה על-ידי Shirly11 יום חמישי 21 אוגוסט 2014 17:28
    יום ראשון 17 אוגוסט 2014 13:04
    מנחה דיון

כל התגובות

  • שבת שלום שירלי

    אני רואה שאת מטיילת בכל הפורומים :-)
    לפני כמה שעות סימנת הודעה שלי בפורום בתחום ה SQL במערכת העולמית באנגלית וראיתי שאת מבלה גם בפורומים של C# באנגלית וכבר נפגשנו במערכת בעברית בעבר :-) את ממש תייר חופשי :-)

    בכל מקרה השאלה שלך כרגע לא קשורה בכלום ל SQL Server או אפילו לשפת SQL. זו שאלה טהורה בשפת C#.
    לכן אני אעביר את השאלה בהמשך לפורום המתאים: כן יש לנו פורום C# גם בעברית :-)

    בכל מקרה התשובה פשוטה: השאילתה שלך יוצרת אוסף של נתונים ולא ערך של נתון ולכן כאשר את מנסה לבצע הצגה של האוסף בעזרת המתודה ToString אז את מקבלת את הסוג של האלמנט. זו ההגדרה של המתודה ה ToString. באותה צורה יקרה אם תבצעי את הפעולה הבאה:

    List<int> d = new List<int>();
    d.Add(1);
    d.Add(3);

    ועתה תנסי להציג את הערך של d.ToString

    אז מה הפתרון?

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

    * במקרה שרוצים להחזיר ערך בודד אז אפשר בשאילתה לפני הפעולה של ה tostring להכניס סינון כמו First. זה יוסיף מאחורי הקלעים לשאילתה האמיתית שמריץ השרת top 1 ולכן תחזור רק תוצאה אחת.

                var db = new Entities();
                var res = from x
                          in db.webS
                          where x.ID == id
                          select x.Name.First();
                return res.ToString();


    [Personal Site] [Blog] [Facebook]signature

    שבת 16 אוגוסט 2014 16:31
    מנחה דיון
  • נקודה חשובה מאוד!

    אם היית עובדת בצורה יותר זהירה עם אלמנטים בעלי סוג מוגדר מראש אז לא היית נתקלת בבעיות כאלה. השימוש ב VAR הוא מקור הבעיות שלך. אם היית מראש מגדירה את res למשל כאובייקט של מחלקת String אז היית מזהה את הבעיה כבר במן הקימפול של התוכנה. זה חלק מהייתרונות של OOP שאת לא מנצלת. העבודה עם VAR מסוכנת ולא מומלצת לדעתי פרט למקרים מאוד מסויימים כמו מצבים בהם אין לנו דרך לדעת מראש את סוג האלמנט למשל (למשל בעבודה עם רפליקציה זו לפעמים הדרך היחידה). מצד שני גם בעבודה עם LINQ לפעמים זו הדרך היותר מתאימה אם לא רוצים לבצע המרה מפורשת.


    [Personal Site] [Blog] [Facebook]signature

    שבת 16 אוגוסט 2014 16:36
    מנחה דיון
  • זה עדיין לא עזר, הפעם קיבלתי:

    System.Data.Objects.ObjectQuery`1[System.Char]

    איך אוכל להראות ממש את השם?

    יום ראשון 17 אוגוסט 2014 07:50
  • תנסי להפעיל את המתודה FIRST בזמן השימוש ולא בזמן הבחירה למשל. משהו כזה:

    DataClasses1DataContext db = new DataClasses1DataContext();
    var res = from u in db.Orders select u.Number; // here we get a list of object
    Console.WriteLine(String.Format("query: {0}", res.First().ToString()));

    קשה לי לנחש בלי לראות את כל הקוד הקשור לבעיה אבל מהתוצאות שלך כניראה שזה יעבד בשבילך (הפורמט של הקוד טוב ובדקתי אותו כרגע בפועל).

    דרך נוספת היא כך:

    DataClasses1DataContext db = new DataClasses1DataContext();
    var res = db.Orders.First().Number;
    Console.WriteLine(String.Format("query: {0}", res.ToString()));


    [Personal Site] [Blog] [Facebook]signature


    • נערך על-ידי pituachMVP, Moderator יום ראשון 17 אוגוסט 2014 13:29
    • סומן כתשובה על-ידי Shirly11 יום חמישי 21 אוגוסט 2014 17:28
    יום ראשון 17 אוגוסט 2014 13:04
    מנחה דיון