¿Debería mi DAL devolver DataTables o I & # 8230; lo que sea < > ;?
-
08-07-2019 - |
Pregunta
EDITAR 1
Pido disculpas, pero después de leer los 2 artículos sugeridos todavía no entiendo lo que debo usar. Entiendo que usar IQueryable no es preferido por varias razones, pero ¿eso también elimina IEnumerable? ¿Es una DataTable realmente mi mejor opción?
En resumen, supongo, ¿cuál es el tipo de retorno preferido?
Tengo la siguiente consulta LINQ simple que quiero resumir en un DAL. ¿Cuál es el tipo de var y, por lo tanto, de qué tipo debería ser mi método?
ConnectDBDataContext context = new ConnectDBDataContext();
var lName = textEdit1.Text;
var searchByPersonLName = from c in context.tblPersons
where c.LastName == lName
orderby c.LastName
select new { c.FirstName,c.LastName,c.PersonID};
dataGridView1.DataSource = searchByPersonLName;
Cuando paso el mouse sobre VS en VS dice IQueryable < T >
pero cuando pongo un punto de interrupción y lo ejecuto, parece llamarse a sí mismo IEnumerable. ¿Cuál es correcto y cómo debo declarar mi método?
Me gusta esto - >
public static DataTable SearchPerson(string SearhParam)
{
ConnectDBDataContext context = new ConnectDBDataContext();
var persons = (from person in context.tblPersons
orderby person.LastName
select new { person.PersonID, person.LastName, person.FirstName, person.SSN });
var filteredPersonsList = persons.Where(p => p.LastName == SearhParam).ToList();
if (filteredPersonsList.Count == 0)
filteredPersonsList = persons.Where(p => p.LastName.StartsWith(SearhParam)).ToList();
var dataTable = filteredPersonsList.CopyLinqToDataTable();
return dataTable;
}
Si uso IQueryable < T >
¿qué es < T >
o cómo sé eso y qué devolvería?
¡Gracias!
Para referencia, CopyToDataTable () está debajo.
public static DataTable CopyLinqToDataTable<T>(this IEnumerable<T> source)
{
return new ObjectShredder<T>().Shred(source, null, null);
}
public static DataTable CopyLinqToDataTable<T>(this IEnumerable<T> source,
DataTable table, LoadOption? options)
{
return new ObjectShredder<T>().Shred(source, table, options);
}
Solución
Lo que quiere decir es asignar sus datos al objeto que desea que devuelva el DAL.
En respuesta a su primera pregunta " var " es realmente la abreviatura de variable, y el tipo es el tipo que se define en la asignación.
var myvariable = string.empty;
En este ejemplo, el tipo es el de una cadena.
var myreader = new StringReader();
Mientras que en este ejemplo, el tipo es el de un StringReader.
En cuanto a su segunda pregunta de "qué es". T es un tipo genérico.
Para ver un ejemplo de dónde su dal devolvería un objeto real:
public Product GetProduct(int ProductID)
{
var product = from p in db.MyTable
where p.productID == ProductID
select new product { name = p.name, pricepoint = p.pricepoint, qty = p.quantity };
return product;
}
Otros consejos
En primer lugar, IQueryable implementa IEnumerable, por lo que es posible que esté viendo ambos. Consulte aquí para obtener más detalles
Generalmente, recomendaría que su DAL devuelva sus objetos reales siempre que sea posible.
Me gustaría leer este blog para obtener pautas sobre cómo y cómo no hacer lo que está sugiriendo. Respuesta corta, no devuelva IQueryable.
EDITAR: Ejemplo:
internal static File[] GetAllFilesByUserID(int userID)
{
var db = GetDataContext();
return (from files in db.Files where files.OwnerUserID == userID select files).ToArray();
}