Resultados de consultas LINQ y métodos de cadena
-
29-10-2019 - |
Pregunta
En primer lugar, permítame disculparme por el muro de código.Básicamente, tengo dos consultas contra listas de Sharepoint.El código parece funcionar muy bien si comento un par de líneas.Aquí está el código:
Global:
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;`
Carga de la página:
// 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");`
Código principal:
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);
}
}
Si hago un comentario:
if (phn.StartsWith("971"))
y
string extension = phn.Substring(phn.Length - 4, 4);
todo va bien.Si los dejo, solo completa el primer foreach.Intenté cambiar el nombre de todas las variables en la segunda consulta, convirtiendo explícitamente r.phone en una cadena y colocando ToArray al final de la consulta de resultados.Ninguno de estos ayudó.
Curiosamente, si utilizo results = results.Take(5);
para recorrer algunos, obtengo las habitaciones.Verificando el recuento de resultados y el recuento de res (los resultados de la segunda consulta) ambos son iguales - 5.
¿Cómo puedo restablecer todo para poder consultar mis listas nuevamente?
Solución
¿Es posible que phn sea nulo?
Intente reemplazar r.phone!="" con string.IsNullOrEmpty (r.phone) y / o active las excepciones a la primera oportunidad en su depurador.(Depurar-> Excepciones-> Excepciones en tiempo de ejecución de lenguaje común [comprobar])