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);
    }
¿Fue útil?

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();
    }
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top