Подтвердить что ты не робот

Как добавить новую запись в переменную IQueryable?

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

4b9b3361

Ответ 1

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

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

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

IQueryable<string> names = [...];
names = names.AsEnumerable().Concat(new[] { "(None)", "(Add new)" });

Ответ 2

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

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

EDIT: убедитесь, что вам нужно переназначить foo.

Ответ 3

Простым ответом является то, что если вы не добавите запись в базовое хранилище данных, которое запрашивает 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 a list
var results = query.ToList().Add(new { SexCode = -1, SexName = "Please select your Gender" });

SelectList sliSex = new SelectList(results, "SexCode", "SexName");

Ответ 4

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

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

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

Возврат IEnumerable <T> vs. IQueryable <T>

по

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

Ответ 5

Попробуйте следующее:

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

var results = query.ToList().Concat(new clClinic[] { new clClinic()});  

Ответ 6

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

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 является "длинным", а по умолчанию -1 является "int". Если вы отложите -1 до длинного (или типа 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");

Ответ 7

Поскольку результаты 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 = "Пожалуйста, выберите ваш пол" }})