private IQueryable <Fotografia> creaQueryEntita(ParamCercaFoto param) { var qq = this.objectContext.Fotografie.Include("fotografo"); if (!param.evitareJoinEvento) { qq = qq.Include("evento"); } var qq2 = qq; IQueryable <Fotografia> query = qq2.AsQueryable(); // ----- Filtro eventi // Siccome non esiste la WhereIn, me la sono creata io. // Seguire questa discussione : http://social.msdn.microsoft.com/Forums/en-US/adodotnetentityframework/thread/095745fe-dcf0-4142-b684-b7e4a1ab59f0 if (param.eventi != null) { // Siccome ancora linq non supporta confronto con entità, devo estrarre gli id IEnumerable <Guid> listaIds = from le in param.eventi select le.id; query = query.Where(ff => listaIds.Contains(ff.evento.id)); } // ----- Filtro scarico card if (param.scarichiCard != null) { IEnumerable <DateTime> listaDate = from le in param.scarichiCard select le.tempo; query = query.Where(ff => listaDate.Contains(ff.dataOraAcquisizione)); } // ----- Filtro fotografo if (param.fotografi != null) { // Siccome ancora linq non supporta confronto con entità, devo estrarre gli id var listaIds = from le in param.fotografi select le.id; query = query.Where(ff => listaIds.Contains(ff.fotografo.id)); } if (param.idsFotografie != null) { query = query.Where(ff => param.idsFotografie.Contains(ff.id)); } if (param.numeriFotogrammi != null) { int[] range = FotoRangeUtil.rangeToString(param.numeriFotogrammi); // Testo se ho un range o una lista if (param.numeriFotogrammi.Contains('-')) { int estInf = range[0]; int estSup = range[1]; // ----- RANGE di fotogramma query = query.Where(ff => ff.numero >= estInf); if (range[1] > 0) { query = query.Where(ff => ff.numero <= estSup); } } else { // ----- numeri di fotogramma query = query.Where(ff => range.Contains(ff.numero)); } } // ----- fasi del giorno (la Enum non prevede il Contains. Devo trasformarla in una array di interi if (param.fasiDelGiorno != null && param.fasiDelGiorno.Count > 0) { IEnumerable <short> fasiInt = from p in param.fasiDelGiorno select Convert.ToInt16(p); query = query.Where(ff => fasiInt.Contains((short)ff.faseDelGiorno)); } // ----- Didascalia (le didascalie le memorizziamo solo in maiuscolo) if (!String.IsNullOrWhiteSpace(param.didascalia) && param.didascalia != "%") { if (param.didascalia.Contains("%")) { string dida; if (param.didascalia.StartsWith("%") && param.didascalia.EndsWith("%")) { // Cerco nel mezzo dida = param.didascalia.Substring(1, param.didascalia.Length - 2); query = query.Where(ff => ff.didascalia.Contains(dida)); } else { if (param.didascalia.StartsWith("%")) { dida = param.didascalia.Substring(1); query = query.Where(ff => ff.didascalia.EndsWith(dida)); } else if (param.didascalia.EndsWith("%")) { dida = param.didascalia.Substring(0, param.didascalia.Length - 1); query = query.Where(ff => ff.didascalia.StartsWith(dida)); } } } else { query = query.Where(ff => ff.didascalia.Equals(param.didascalia)); } } // ----- Giornata Inizio if (param.giornataIniz != null) { query = query.Where(ff => ff.giornata >= param.giornataIniz); } // ----- Giornata Fine if (param.giornataFine != null) { query = query.Where(ff => ff.giornata <= param.giornataFine); } // ----- Ordinamento if (param.ordinamento != null) { if (param.ordinamento == Ordinamento.Asc) { query = query.OrderBy(ff => ff.dataOraAcquisizione).ThenBy(ff => ff.numero); } if (param.ordinamento == Ordinamento.Desc) { query = query.OrderByDescending(ff => ff.dataOraAcquisizione).ThenByDescending(ff => ff.numero); } } return(query); }
internal static string creaQuerySQLWhere(ParamCercaFoto param, ref List <Object> paramOut) { StringBuilder sql = new StringBuilder(); sql.Append(" where 1=1"); sql.Append(SEPAR); #region Where - Eventi // Eventi if (param.eventi != null) { if (param.eventi.Length == 1) { sql.Append("AND f.evento_id = {" + paramOut.Count + "}"); paramOut.Add((string)param.eventi.ElementAt(0).id.ToString()); // Forzatura: devo convertirlo in stringa } else { sql.Append("AND f.evento_id in ( "); foreach (var p in param.eventi) { sql.Append("{" + paramOut.Count + "},"); paramOut.Add((string)p.ToString()); // Forzatura: devo convertirlo in stringa } sql.Replace(',', ')', sql.Length - 1, 1); // Rimuovo l'ultima virgola di troppo e la sostituisco con la parentesi chiusa } sql.Append(SEPAR); } #endregion Where - Eventi #region Where - ScaricoCard // ----- Filtro scarico card if (param.scarichiCard != null) { IEnumerable <DateTime> listaDate = from le in param.scarichiCard select le.tempo; if (listaDate.Count() == 1) { sql.Append("AND f.dataOraAcquisizione = {" + paramOut.Count + "}"); paramOut.Add(listaDate.ElementAt(0)); } else { sql.Append("AND dataOraAcquisizione in ( "); foreach (var d in listaDate) { sql.Append("{" + paramOut.Count + "},"); paramOut.Add(d); } sql.Replace(',', ')', sql.Length - 1, 1); // Rimuovo l'ultima virgola di troppo e la sostituisco con la parentesi chiusa } sql.Append(SEPAR); } #endregion Where - ScaricoCard #region Where - Fotografo // ----- Filtro fotografo if (param.fotografi != null) { if (param.fotografi.Length == 1) { sql.Append("AND f.fotografo_id = {" + paramOut.Count + "}"); paramOut.Add(param.fotografi.ElementAt(0).id); } else { sql.Append("AND f.fotografo_id in ( "); foreach (var oo in param.fotografi) { sql.Append("{" + paramOut.Count + "},"); paramOut.Add(oo.id); } sql.Replace(',', ')', sql.Length - 1, 1); // Rimuovo l'ultima virgola di troppo e la sostituisco con la parentesi chiusa } sql.Append(SEPAR); } #endregion Where - Fotografo #region Where - ids Foto // --- id delle fotografie if (param.idsFotografie != null) { sql.Append("AND f.id in ( "); foreach (var id in param.idsFotografie) { sql.Append("{" + paramOut.Count + "},"); paramOut.Add((string)id.ToString()); } sql.Replace(',', ')', sql.Length - 1, 1); // Rimuovo l'ultima virgola di troppo e la sostituisco con la parentesi chiusa sql.Append(SEPAR); } #endregion Where - ids Foto #region Where - numerifotogrammi // --- numeri di fotogrammi if (param.numeriFotogrammi != null) { int [] range = FotoRangeUtil.rangeToString(param.numeriFotogrammi); // Testo se ho un range o una lista if (param.numeriFotogrammi.Contains('-')) { int estInf = range [0]; int estSup = range [1]; // ----- RANGE di fotogramma sql.Append("AND f.numero >= {" + paramOut.Count + "}"); sql.Append(SEPAR); paramOut.Add(estInf); if (range [1] > 0) { sql.Append("AND f.numero <= {" + paramOut.Count + "}"); paramOut.Add(estSup); sql.Append(SEPAR); } } else { // ----- numeri di fotogramma sql.Append("AND f.numero in ( "); foreach (var nn in range) { sql.Append("{" + paramOut.Count + "},"); paramOut.Add(nn); } sql.Replace(',', ')', sql.Length - 1, 1); // Rimuovo l'ultima virgola di troppo e la sostituisco con la parentesi chiusa sql.Append(SEPAR); } } #endregion Where - numerifotogrammi #region Where - Fasi del giorno // ----- fasi del giorno (la Enum non prevede il Contains. Devo trasformarla in una array di interi if (param.fasiDelGiorno != null && param.fasiDelGiorno.Count > 0) { IEnumerable <short> fasiInt = from p in param.fasiDelGiorno select Convert.ToInt16(p); sql.Append("AND f.faseDelGiorno in ( "); foreach (var nn in fasiInt) { sql.Append("{" + paramOut.Count + "},"); paramOut.Add(nn); } sql.Replace(',', ')', sql.Length - 1, 1); // Rimuovo l'ultima virgola di troppo e la sostituisco con la parentesi chiusa sql.Append(SEPAR); } #endregion Where - Fasi del giorno #region Where - Didascalia // ----- Didascalia (le didascalie le memorizziamo solo in maiuscolo) if (!String.IsNullOrWhiteSpace(param.didascalia) && param.didascalia != "%") { if ("(VUOTA)".Equals(param.didascalia, StringComparison.CurrentCultureIgnoreCase)) { // Caso particolare : voglio solo i nulli. sql.Append("AND f.didascalia is null "); } else if ("(PIENA)".Equals(param.didascalia, StringComparison.CurrentCultureIgnoreCase)) { // Caso particolare : voglio solo i NON nulli. sql.Append("AND f.didascalia is not null "); } else { sql.Append("AND f.didascalia like "); sql.Append("{" + paramOut.Count + "}"); paramOut.Add(param.didascalia); sql.Append(SEPAR); } } #endregion Where - Didascalia #region Date // ----- Giornata Inizio if (param.giornataIniz != null) { sql.Append("AND f.giornata >= "); sql.Append("{" + paramOut.Count + "}"); paramOut.Add(param.giornataIniz); sql.Append(SEPAR); } // ----- Giornata Fine if (param.giornataFine != null) { sql.Append("AND f.giornata <= "); sql.Append("{" + paramOut.Count + "}"); paramOut.Add(param.giornataFine); sql.Append(SEPAR); } #endregion Date #region vendute/non vendute if (param.soloVendute != null && param.soloVendute == true) { sql.Append("AND (f.contaStampata > 0 or f.contaMasterizzata > 0)"); sql.Append(SEPAR); } if (param.soloVendute != null && param.soloVendute == false) { sql.Append("AND (f.contaStampata = 0 and f.contaMasterizzata = 0)"); sql.Append(SEPAR); } #endregion vendute/non vendute // TODO ..... altri parametri mancanti sql.Append(" "); return(sql.ToString()); }