Должен ли мой DAL возвращать DataTables или я ... что угодно <>? - PullRequest
1 голос
/ 07 мая 2009

РЕДАКТИРОВАТЬ 1

Я прошу прощения, но после прочтения 2 предложенных статей я все еще не понимаю, что мне следует использовать. Я понимаю, что использование IQueryable не является предпочтительным по разным причинам, но устраняет ли это также IEnumerable? Является ли DataTable действительно моим лучшим вариантом?

Короче, я думаю, какой тип возврата предпочтителен?


У меня есть следующий простой запрос LINQ, который я хочу абстрагировать в DAL. Какой тип var и, следовательно, каким должен быть мой метод?

            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;

Когда я нахожу его в VS, он говорит IQueryable<T>, но когда я ставлю точку останова и запускаю ее, кажется , чтобы называть себя IEnumerable. Что правильно и как мне объявить мой метод?

Вот так ->

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

Если я использую IQueryable<T>, что такое <T> или как я узнаю это и что я верну?

Спасибо!

Для справки: CopyToDataTable () ниже.

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

Ответы [ 2 ]

3 голосов
/ 07 мая 2009

Во-первых, IQueryable реализует IEnumerable, поэтому вы потенциально видите оба варианта. См. здесь для получения более подробной информации

Как правило, я бы порекомендовал вашему DAL возвращать ваши фактически объекты, когда это возможно.

Я бы прочитал этот блог , чтобы узнать, как и как не делать то, что вы предлагаете. Короткий ответ, не возвращайте IQueryable.

EDIT: Пример:

        internal static File[] GetAllFilesByUserID(int userID)
    {
        var db = GetDataContext();
        return (from files in db.Files where files.OwnerUserID == userID select files).ToArray();
    }
2 голосов
/ 08 мая 2009

Он имеет в виду, что сопоставляет ваши данные с объектом, который вы хотите, чтобы DAL возвращал.

В ответ на ваш первый вопрос «var» на самом деле просто означает переменную, а тип - это то, что тип определен в присваивании.

var myvariable = string.empty;

В этом примере тип является типом строки.

var myreader = new StringReader();

Хотя в этом примере это тип StringReader.

Что касается вашего второго вопроса «что есть». T является универсальным типом.

Пример того, где ваш дал бы вернуть фактический объект:

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