LINQ查询结果和字符串方法

时间:2011-05-05 17:34:20

标签: linq sharepoint-2010 linq-to-objects linq-to-sharepoint

首先让我为代码墙道歉。基本上,我有两个针对Sharepoint列表的查询。如果我评论几行,代码似乎很有用。这是代码:

全局:

private string mUserName = "";
// Entity classes for the Sharepoint Lists
private SeatingChartContext _dc;
private EntityList<Seating_chartItem> _seatCharts;
private EntityList<UsersItem> _users;
private EntityList<Excluded_usersItem> _exusers;
private EntityList<RoomsItem> _rooms;
private EntityList<LogsItem> _logs;`

页面加载:

// Get the Lists from Sharepoint
_dc = new SeatingChartContext(SPContext.Current.Web.Url);
_seatCharts = _dc.GetList<Seating_chartItem>("seating_chart");
_users = _dc.GetList<UsersItem>("users");
_exusers = _dc.GetList<Excluded_usersItem>("excluded_users");
_rooms = _dc.GetList<RoomsItem>("rooms");
_logs = _dc.GetList<LogsItem>("logs");`

主要代码:

try
{
    //  - - - - -   L O A D   T H E   * P E O P L E *   - - - - -

    // Create List objects
    List<Seating_chartItem> seatList = (from seat in _seatCharts where seat.Room == 0 where seat.Floor == floor select seat).ToList();
    List<UsersItem> usersList = (from user in _users select user).ToList();
    var xusersList = (from xuser in _exusers select xuser.User_id).ToList();
    usersList = usersList.Where(user => !xusersList.Contains(user.User_id)).ToList();

    // Query and use anonymous object for values
    var results = from seat in seatList
                  join user in usersList on
                  seat.User_id equals user.User_id
                  select new
                             {
                                 sid = seat.Seat_id,
                                 icon = seat.Icon,
                                 topCoord = seat.Top_coord,
                                 leftCoord = seat.Left_coord,
                                 name = user.Name,
                                 phone = user.Phone,
                                 mobile = user.Mobile,
                                 content = seat.Content
                             };

    results = results.Take(5);
    foreach (var r in results)
    {
        ImageButton img = new ImageButton();
        img.ID = "seat-" + r.sid;
        img.ImageUrl = "http://cxsmoss/rooms/" + r.icon;
        img.Style.Add(HtmlTextWriterStyle.Position, "absolute");
        img.Style.Add(HtmlTextWriterStyle.Top, r.topCoord + "px");
        img.Style.Add(HtmlTextWriterStyle.Left, r.leftCoord + "px");
        if (r.name == "")
            img.ToolTip = "no name!";
        else
            img.ToolTip = r.name;
        if (r.phone != "")
        {
            string phn = r.phone;
            if (phn.StartsWith("971")) // Comment this line
            {
                string extension = phn.Substring(phn.Length - 4, 4); //Comment this line
                img.ToolTip += Environment.NewLine + "x" + extension;

            }
            else
                img.ToolTip += Environment.NewLine + "x" + phn;
        }
        if (r.mobile != "")
            img.ToolTip += Environment.NewLine + "mobile:  " + r.mobile;
        img.ToolTip += Environment.NewLine + "room/cubicle: " + r.content.ToLower().Replace("seat ", "");
        img.PostBackUrl = ""; // "Default.aspx?name=" + row["name"].ToString();
        img.OnClientClick = "UpdateEmployeeInfo('" + r.name.ToString() + "', '" + img.ID + "');return false;";
        // For debugging size
        img.ToolTip += Environment.NewLine + "Results size " + results.Count();
        floorPanel.Controls.Add(img);
    }


    //  - - - - -   L O A D   T H E   * R O O M S *   - - - - -

    List<Seating_chartItem> seatListRooms = (from seatRoom in _seatCharts where seatRoom.Room == 1 where seatRoom.Floor == floor select seatRoom).ToList();
    List<RoomsItem> roomsList = (from room in _rooms select room).ToList();

    // Query and use anonymous object for values
    var res = from seatRoom in seatListRooms
              join room in roomsList on
              seatRoom.Seat_id equals room.Room_id
              select new
              {
                  rid = room.Room_id,
                  name = room.Name,
                  icon = seatRoom.Icon,
                  topCoord = seatRoom.Top_coord,
                  leftCoord = seatRoom.Left_coord,
                  phone = room.Phone,
                  content = seatRoom.Content
              };

    foreach (var s in res)
    {
        ImageButton img = new ImageButton();
        img.ID = "room-" + s.rid;
        //img.ID = row["icon"].ToString();
        img.ImageUrl = "http://cxsmoss/rooms/" + s.icon;
        img.Style.Add(HtmlTextWriterStyle.Position, "absolute");
        img.Style.Add(HtmlTextWriterStyle.Top, s.topCoord + "px");
        img.Style.Add(HtmlTextWriterStyle.Left, s.leftCoord + "px");
        img.ToolTip = s.name;
        if (s.phone != "")
            img.ToolTip += Environment.NewLine + "x" + s.phone;
        img.ToolTip += Environment.NewLine + "room " + s.content;
        img.OnClientClick = "UpdateRoomInfo('" + s.name + "', '" + img.ID + "');return false;";
        img.ToolTip += Environment.NewLine + "Res size " + results.Count();
        floorPanel.Controls.Add(img);
    }
}

如果我发表评论:

if (phn.StartsWith("971"))

string extension = phn.Substring(phn.Length - 4, 4);
一切都运行良好。如果我把它们留在里面只完成第一个foreach。我已经尝试重命名第二个查询中的所有变量,显式地将r.phone转换为字符串并将ToArray放在结果查询的末尾。这些都没有帮助。

有趣的是,如果我使用results = results.Take(5);来完成一些我得到的房间。检查结果的数量和res的数量(第二个查询的结果)它们都是相同的 - 5.

如何重置所有内容以便我可以再次查询我的列表?

1 个答案:

答案 0 :(得分:1)

phn是否可能为空?

尝试用string.IsNullOrEmpty(r.phone)替换r.phone!=“”和/或在调试器中启用第一次机会异常。 (Debug-&gt; Exceptions-&gt; Common Language Runtime Exceptions [check])