Вставка дополнительных данных в результат linq, но не в источник данных или ожидание отправки изменений в объект контекста - PullRequest
2 голосов
/ 20 февраля 2010

Когда у меня был типизированный DataTable с информацией, полученной из SQL Server с помощью табличного адаптера, я могу вставлять временные данные в этот DataTable, который я просто хочу использовать во время выполнения, и я не хочу, чтобы он быть вставленным в базу данных.
Сначала предположим, что, например, у меня есть таблица базы данных, например:

CREATE TABLE MyData
(
    MyCol1 int,
    MyCol2 nchar(10)
)

Так что, используя объекты SqlClient, это то, что я делаю.

MyTypedDataSet.MyTypedDataTable myDataTable = 
    new MyTypedDataSet.MyTypedDataTable();
myDataAdapter.Fill(myDataTable);
myDataTable.NewMyTypedRow(value1, value2);

Тогда я мог бы связать это с контролем, например, ComboBox

myComboBox.DataSource = myDataTable;
myComboBox.DisplayMember = "myCol2";
myComboBox.ValueMember = "myCol1";

Как я могу сделать то же самое с результатом LINQ to SQL, например:

var myQuery = from data in myContext.MyDatas
              select myCol1, myCol2;
myComboBox.DataSource = myQuery;

Видите, я хочу добавить эту дополнительную строку в myQuery, чтобы я мог связать эти данные со своим комбинированным списком, но я не хочу эту дополнительную строку в моей базе данных.
Я обошел его, вызвав метод ToList(), затем добавил нужные данные и привязал этот список к своему ComboBox, например:

var myList = myQuery.ToList();
myList.Insert(0, new MyData() { myCol1 = value1, myCol2 = value2 });
myComboBox.DataSource = myList;

... Но как я могу сделать эту вставку прямо в myQuery? это будет хорошей практикой? или мой обходной путь будет правильным?

PS: Кстати, когда я использовал для привязки типизированных таблиц данных к комбинированным спискам, я использовал имена, сгенерированные схемой, для присвоения значений DisplayMember и ValueMember следующим образом:

myComboBox.DisplayMember = myDataTable.myCol1Column.ColumnName;
myComboBox.ValueMember = myDataTable.myCol2Column.ColumnName;

Как мне извлечь эту информацию из myQuery?

Ответы [ 3 ]

2 голосов
/ 20 февраля 2010

Я думаю, что вы делаете хорошо.

В качестве альтернативы вместо создания списка и вставки в него можно создать новый список, содержащий один элемент, и использовать метод Concat для объединения оставшихся элементов. Это может быть одна строка LINQ. Но ваш путь, вероятно, более читабелен, так что, возможно, просто придерживайтесь этого.

0 голосов
/ 20 февраля 2010
myComboBox.DataSource = new[] { new MyData { myCol1 = value1, myCol2 = value2 } }
                        .Concat(myQuery);
0 голосов
/ 20 февраля 2010

Вы можете просто добавить элемент в коллекцию элементов ComboBox после того, как он был привязан к данным.

...