Frage

EDIT 1

Ich entschuldige mich, aber die 2 vorgeschlagenen Artikel nach der Lektüre ich verstehe immer noch nicht, was ich verwenden soll. Ich verstehe, dass die Verwendung von IQueryable aus verschiedenen Gründen nicht bevorzugt, aber dass IEnumerable nicht beseitigt auch? Ist ein Datatable wirklich meine beste Option?

Kurz gesagt, ich denke, was ist der bevorzugte Rückgabetyp?


Ich habe die folgende einfache LINQ-Abfrage, die ich heraus in eine DAL abstrahieren will. Was ist die Art von var und damit, welche Art sollte meine Methode sein?

            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;

Wenn ich über sie in VS schweben sagt es IQueryable<T> aber wenn ich in einem Haltepunkt setzen und sie es laufen scheint selbst IEnumerable zu nennen. Was ist richtig und wie soll ich meine Methode deklarieren?

Wie this ->

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

Wenn ich IQueryable<T> was <T> oder wie kann ich wissen, dass und was würde ich wiederkommen?

Danke!

Für Referenz des CopyToDataTable () unter.

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);
    }
War es hilfreich?

Lösung

Was er meint, ist Ihre Daten an das Objekt ordnen Sie die DAL zurückkehren wollen, sind.

In Antwort auf Ihre erste Frage „var“ ist eigentlich nur kurz für Variable, und der Typ ist, was jemals Art in der Zuordnung definiert ist.

var myvariable = string.empty;

In diesem Beispiel ist der Typ, der eine Zeichenfolge ist.

var myreader = new StringReader();

Während in diesem Beispiel die Art des einen String ist.

Was Ihre zweite Frage „was ist“. T ist ein generischer Typ.

Für ein Beispiel, wo Ihr dal wäre ein tatsächliches Objekt Rückkehr:

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

Andere Tipps

Zunächst einmal, implementiert IQueryable IEnumerable, damit ist, warum Sie möglicherweise beide zu sehen sind. Siehe hier für weitere Details

Generell würde ich Ihre DAL zurückkehren Ihre tatsächlich Objekte, wann immer möglich empfehlen.

Ich würde lesen Blog für Richtlinien, wie, und wie nicht zu tun, was Sie vorschlagen. Kurze Antwort, nicht zurück IQueryable.

EDIT: Beispiel:

        internal static File[] GetAllFilesByUserID(int userID)
    {
        var db = GetDataContext();
        return (from files in db.Files where files.OwnerUserID == userID select files).ToArray();
    }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top