Как добавить новую запись в переменную IQueryable? - PullRequest
24 голосов
/ 12 января 2009

Результаты IQueryable запрашиваются из моей базы данных с помощью LINQ. Как добавить новую запись в результат IQueryable.

Ответы [ 8 ]

37 голосов
/ 12 января 2009

Хотите добавить его в базу данных или просто в список результатов, которые будут использоваться другими вещами, такими как привязка данных?

Если это первое, вам нужно будет использовать обычную операцию добавления для любого типа LINQ, который вы используете, но для представления таблицы, а не для IQueryable. Запросы только для чтения данных.

Если это последнее, используйте Enumerable.Concat , чтобы объединить существующую последовательность (IQueryable) с новой, содержащей ваши дополнительные записи (здесь будет хорошо работать массив или список), и используйте результат для привязки и т. д. Вероятно, стоит сначала использовать AsEnumerable (), чтобы убедиться, что Enumerable используется вместо Queryable. Например:

IQueryable<string> names = [...];
names = names.AsEnumerable().Concat(new[] { "(None)", "(Add new)" });
13 голосов
/ 12 января 2009

Вы должны сначала преобразовать его в список;

IQueryable<int> foo = new SomeQueryable<int<();
List<int> list = foo.ToList();
list.Add(5);

или с помощью Concat

IQueryable<int> foo = new SomeQueryable<int<();
foo = foo.Concat(new int[]{5});

РЕДАКТИРОВАТЬ: уверен, что вы должны переназначить foo.

5 голосов
/ 18 февраля 2009

Простой ответ заключается в том, что если вы не добавите запись в базовое хранилище данных, которое запрашивает Iqueryable, вы не сможете добавить новую запись в IQueryable. Поэтому, если вы используете LinqToSql, вам нужно будет добавить строку в таблицу, к которой запрашивал IQueryable, чтобы «добавить» строку в IQueryable.

Помните, что IQueryable - это не набор результатов, это запрос. Пока вы не используете что-то вроде .ToList (), IQueryable не будет оценивать набор результатов и, что более важно, IQueryable не будет зависеть от этого набора результатов. Он создает список и помещает результаты в. Это означает, что если вы дважды вызываете ToList () для Iqueryable, он дважды отключается и запрашивает базу данных. Ему все равно, что это может быть неэффективно.

Итак, если вы посмотрите на примеры, которые другие использовали выше, простое изменение AsEnumerable () на ToList (), скорее всего, решит ваши проблемы.

Что-то вроде:

dcDataContext db = new dcDataContext();
var query = from c in db.tblSexes
              select new { c.SexCode, c.SexName };

var results = query.ToList().Concat(new[] { new { SexCode = -1, SexName = "Please select your Gender" } });

//or even better now that it's a list
var results = query.ToList().Add(new { SexCode = -1, SexName = "Please select your Gender" });

SelectList sliSex = new SelectList(results, "SexCode", "SexName");
3 голосов
/ 15 сентября 2015

Это может быть очень старый вопрос, я хотел бы добавить больше объяснений и примеров здесь

если вы используете IQueryable<YourObject>, вы должны сначала преобразовать его в IEnumerable<YourObject>

дополнительная информация о IEnumerable:

Возвращается IEnumerable против IQueryable

от

IQueryable<YourObject> iqueryResult = // ..... your LinQ or whatever
IEnumerable<YourObject> enumResult = iqueryResult.AsEnumerable();

затем, чтобы добавить, вы можете сделать это

enumResult = enumResult.Concat(new[] {new YourObject()
                 { 
                    //.... 
                 } 
             });

образец реального кода

var iquery_QRDTR = from rrp in P_QCDTR
        select new WebRequestData
        {
             ros_chk_id = rrp.CHECKIN_ID,
             ros_img = rrp.EMPLOYEE_ASSOCIATE.IMAGE_URL
        };

var enum_QRDTR = iquery_QRDTR.AsEnumerable();

enum_QRDTR = enum_QRDTR.Concat(new[] {new WebRequestData()
             {
             ros_chk_id = 16,
             ros_img = "http://link.to.image/profile.jpg" 
             } });
1 голос
/ 20 ноября 2011

Попробуйте это:

var query = from c in db.clClinics select c; 

var results = query.ToList().Concat(new clClinic[] { new clClinic()});  
0 голосов
/ 18 ноября 2018

Вы можете использовать союз

IQueryable<int> foo = new SomeQueryable<int>();
IQueryable<int> foo2 = new SomeQueryable<int>();
foo = foo.Union(foo2);
0 голосов
/ 12 января 2009

Поскольку результаты IQueryable, вы должны привести к этому

  dcDataContext db = new dcDataContext();
var results = from c in db.tblSexes
              select new { c.SexCode, c.SexName };
results = results.AsEnumerable().Concat(new[] { new { SexCode = -1, SexName = "Please select your Gender"} }).AsQueryable();
SelectList sliSex = new SelectList(results, "SexCode", "SexName");

или без литья

results = results.Union (new [] {new { SexCode = -1, SexName = "Пожалуйста, выберите ваш пол "}})

0 голосов
/ 12 января 2009

Явно установить свойства для анонимных типов. Попробуйте это:

dcDataContext db = new dcDataContext();
var results = from c in db.tblSexes
              select new { c.SexCode, c.SexName };
results = results.AsEnumerable().Concat(new[] { new { SexCode = -1, SexName = "Please select your Gender"} });
SelectList sliSex = new SelectList(results, "SexCode", "SexName");

Редактировать: Вы должны указать точные типы ваших свойств. Я имею в виду, если это int, вы должны указать, что это так. Я полагаю, что SexCode - это long, а по умолчанию -1 - int. Если вы приведете -1 к long (или к типу SexCode), проблема будет решена.

Вот точное решение, если тип SexCode длинный.

dcDataContext db = new dcDataContext();
var results = from c in db.tblSexes
              select new { c.SexCode, c.SexName };
results = results.Concat(new[] { new { SexCode = -1L, SexName = "Please select your Gender"} });
SelectList sliSex = new SelectList(results, "SexCode", "SexName");
...