Question

EDIT 1

Je m'excuse, mais après avoir lu les 2 articles suggérés, je ne comprends toujours pas ce que je devrais utiliser. Je comprends que l’utilisation d’IQueryable n’est pas recommandée pour diverses raisons, mais est-ce que cela élimine également IEnumerable? Un DataTable est-il vraiment ma meilleure option?

En résumé, quel est le type de retour préféré?

J'ai la requête LINQ simple suivante que je veux résumer dans un DAL. Quel est le type de var et donc quel type ma méthode devrait-elle être?

            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;

Lorsque je survole celui-ci dans VS, il indique IQueryable < T > mais lorsque je mets un point d'arrêt et que je l'exécute, il semble s'appeler lui-même IEnumerable. Lequel est correct et comment dois-je déclarer ma méthode?

Comme ceci - >

        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 j'utilise IQueryable < T / gt; , qu'est-ce que < T > ou comment le savoir et que vais-je retourner?

Merci!

Pour référence, la CopyToDataTable () est ci-dessous.

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);
    }
Était-ce utile?

La solution

Cela signifie qu'il mappe vos données sur l'objet que vous souhaitez que le DAL renvoie.

En réponse à votre première question " var " est en réalité juste un raccourci pour variable, et le type correspond au type défini dans l'affectation.

var myvariable = string.empty;

Dans cet exemple, le type est celui d'une chaîne.

var myreader = new StringReader();

Dans cet exemple, le type est celui d'un StringReader.

En ce qui concerne votre deuxième question "Qu'est-ce que"? T est un type générique.

Pour un exemple où votre dal renverrait un objet réel:

 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;
    }

Autres conseils

Tout d’abord, IQueryable implémente IEnumerable, c’est pourquoi vous voyez potentiellement les deux. Voir ici pour plus de détails

.

En général, je recommanderais à votre DAL de renvoyer vos objets lorsque cela est possible.

Je voudrais lire ce blog pour des instructions sur la manière de ne pas faire ce que vous suggérez. Réponse courte, ne retournez pas IQueryable.

EDIT: Exemple:

        internal static File[] GetAllFilesByUserID(int userID)
    {
        var db = GetDataContext();
        return (from files in db.Files where files.OwnerUserID == userID select files).ToArray();
    }
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top