Почему типизированные методы DataSet возвращают неожиданные результаты
Я использую typed DataSets
для доступа к данным, их настройки через DataSet Designer
(общая идея объясняется в этом уроке).
Для каждого стола GetData()
Метод автоматически создается вначале. Возвращает DataTable
иметь ту же схему (т.е. столбцы), что и базовая таблица в базе данных. Если сейчас я создаю собственный метод, используя 'Add query'
В опции, которая должна возвращать только часть данных (скажем, три столбца из шести), DataTable, возвращаемый автоматически сгенерированным методом, по-прежнему состоит из шести столбцов, а три из них не содержат данных.
Это имеет раздражающий побочный эффект, когда я связываю это DataTable
например, для GridView (очевидно, с использованием ObjectDataSource), эти пустые столбцы появляются в GridView
так что я должен удалить их вручную.
Другая связанная проблема заключается в том, что, если я добавлю к соответствующему SQL-query
столбцы с данными из другой таблицы (например, с использованием внутренних объединений или подзапросов), напротив, эти столбцы не добавляются в GridView, хотя я могу связать их вручную в Boundfield
,
Поэтому, если здесь присутствует кто-то, кто еще не полностью перешел на Entity Framework и может объяснить это поведение и помочь преодолеть эти проблемы, я был бы очень признателен за ваш ответ. Заранее спасибо.
ОБНОВИТЬ:
Я ожидаю найти способ получить DataTable
из метода get, созданного DataSet Designer ontop моего SQL-запроса, который будет отражать результаты этого запроса в его схеме. В уроке они говорят, что GetData()
Метод создает и заполняет DataTable для вас и возвращает его как возвращаемое значение метода. Так что интуитивно, почему бы не создать новую таблицу с соответствующими полями.
Так что я надеялся, что делаю что-то не так. Или мои ожидания были неправильными, но тогда кто-то мог объяснить мне, почему.
2 ответа
Хорошо, я могу сказать, что я нашел, как решить это.
Объяснение состоит в том, что соответствующий TableAdapter создает и возвращает любым из своих методов GetData() (включая настраиваемые методы, такие как GetReducedSetOfData()) не просто универсальный DataTable, но точно типизированный DataTable (например, CarSetsDataTable в моем случае). Возможно, в этом и была суть строго типизированных наборов данных, которые я пропустил.
И решение легко на мой взгляд. Вам нужно просто не создавать новые пользовательские методы с, вероятно, измененной схемой данных в качестве возвращаемого значения в существующем адаптере данных, но создавать другие адаптеры данных для той же таблицы БД, которые будут возвращать точно результат другого пользовательского SQL-запроса, который вам нужен методы GetData() по умолчанию.
Я не знаю, может ли создание многих адаптеров данных иметь какие-либо побочные эффекты, но, похоже, это безопасный способ получить именно те данные, которые вам нужны, из типизированного набора данных с минимальными усилиями.
Я не пробовал этого, но я полагаю, что вы можете решить эти проблемы, перенеся результаты таблицы данных в другой известный тип и соответствующим образом связав таблицу. (Я знаю, что это мало смысла, терпеть меня...)
Как пример (хотя и с нетипизированным набором данных):
РЕДАКТИРОВАТЬ - переключился на C# для вас:
EDIT2 - вау, онлайн-конвертер меня сильно подвел - перепечатал, так что теперь он действительно скомпилируется
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
public class myView
{
public string OrderNumber { get; set; }
public int Quantity { get; set; }
public decimal PricePerUnit { get; set; }
public decimal TotalPrice { get; set; }
}
public void SO9(System.Data.DataTable mockTypedDatatable)
{
IEnumerable<myView> results = mockTypedDatatable.AsEnumerable().Select(n => new myView {
OrderNumber = Convert.ToString(n["OrderNumber"]),
Quantity = Convert.ToInt32(n["Quantity"]),
PricePerUnit = Convert.ToDecimal(n["Price"])});
results.ToList().ForEach(x => x.TotalPrice = x.Quantity * x.PricePerUnit);
myGridView.DataSource = results;
myGridView.DataBind();
}
В этом примере я назначил столбцы из притворного типа данных некоторым свойствам, в то время как другие свойства заполняются другими способами (в данном примере это просто умножение Quanty * Price, но вы можете легко это расширить).
надеюсь, это поможет