The IQueryable results is queried from my db using LINQ, How do I add a new record to the IQueryable result.
-
Depends on what "IQueryable result" is. – Gert Arnold Nov 18 '18 at 09:23
8 Answers
Do you want to add it to the database, or just to the list of results that other things like databinding will use?
If it's the former, you'll need to use the normal add operation for whatever kind of LINQ you're using, but to the table representation rather than the IQueryable. Queries only read data.
If it's the latter, use Enumerable.Concat to concatenate your existing sequence (the IQueryable) with a new one containing your extra entries (an array would do fine here, or a list), and use the result for binding etc. It's probably worth using AsEnumerable() first to make sure that Enumerable is used instead of Queryable. For example:
IQueryable<string> names = [...];
names = names.AsEnumerable().Concat(new[] { "(None)", "(Add new)" });

- 1,421,763
- 867
- 9,128
- 9,194
You should first convert it to List;
IQueryable<int> foo = new SomeQueryable<int<();
List<int> list = foo.ToList();
list.Add(5);
or by using Concat
IQueryable<int> foo = new SomeQueryable<int<();
foo = foo.Concat(new int[]{5});
EDIT: sure you have to reassign foo.

- 15,860
- 11
- 50
- 64
-
But my IQueryable variable has two different data types, the SexCode field is an integer, and SexName is a string, so I can't specify the datatype. – Jan 12 '09 at 09:26
-
-
6you can't do this: `IQueryable
foo = new IQueryable – Cacho Santa Jan 20 '12 at 19:06();` IQueryable is an abstract class. -
1sure you cannot initialize an abstract class. it is my mistake. but assume that foo is an IQueryable
instead. – Ali Ersöz May 02 '12 at 17:47
The simple answer is that unless you add the record to the underlying datastore that the Iqueryable is querying, you can't add a new record into an IQueryable. So if you are using LinqToSql then you would have to add a row into the table that the IQueryable was querying in order to "add" a row into the IQueryable.
Remember that an IQueryable is not a result set, it is a query. Until you use something like .ToList() the IQueryable will not evaluate a result set and more importantly, the IQueryable doesn't hang on to that result set. It creates a list and puts the results into in instead. So that means that if you call ToList() on an Iqueryable twice, it will go off and query the database twice. It doesn't care that it might be inefficient.
So, if you look at the examples that others have used above, a simple change of AsEnumerable() to ToList() will most likely fix your problems.
Something like:
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");

- 159
- 3
It might be a very old question, I would like to add more explanation and sample here
if you use IQueryable<YourObject>
, you must convert it to IEnumerable<YourObject>
first
addition detail about IEnumerable:
by
IQueryable<YourObject> iqueryResult = // ..... your LinQ or whatever
IEnumerable<YourObject> enumResult = iqueryResult.AsEnumerable();
then, to add you can do it by
enumResult = enumResult.Concat(new[] {new YourObject()
{
//....
}
});
sample of real code
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
- 1

- 7,073
- 7
- 61
- 71
Try this:
var query = from c in db.clClinics select c;
var results = query.ToList().Concat(new clClinic[] { new clClinic()});

- 11
- 2
-
if you are calling `.ToList()` you might as well call `.Add()` instead of `.Concat()` – w0ns88 Jun 07 '19 at 10:33
Explicitly set properties for anonymous types. Try This:
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");
Edit: You have to point the exact types of you properties. I mean if it is int you have to point that it is. I guess SexCode is a 'long' and by default -1 is an 'int'. If you cast -1 to long(or the type of SexCode) the problem will be solved.
Here is the exact solution if SexCode's type is long.
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");

- 15,860
- 11
- 50
- 64
-
I really appreciate your help, but it still doesn't work, I got the error msg: The type arguments for method 'System.Linq.Enumerable.Concat
, System.Collections.Generic.IEnumerable – Jan 12 '09 at 09:34)' cannot be inferred from the usage. Try specifying the type arguments explicitly. -
Your welcome :) But I think you forgot to give the property names. Try 'new [] { new { SexCode = -1, SexName = "Please select your Gender"} }' not 'new[] { new { -1, "Please select your Gender"} }'. The error mentions that! – Ali Ersöz Jan 12 '09 at 09:41
-
Tried this one, but still won't work :o( Error: The type arguments for method 'System.Linq.Enumerable.Concat
(System.Collections.Generic.IEnumerable – Jan 12 '09 at 09:52, System.Collections.Generic.IEnumerable )' cannot be inferred from the usage. Try specifying the type arguments explicitly. -
Because the results is IQueryable you should cast to it
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");
Or without any casting
results = results.Union(new[] { new { SexCode = -1, SexName = "Please select your Gender"} })

- 91
- 1
- 9
-
can you paste your latest code because I coded my answer and it works – Dincer Uyav Jan 12 '09 at 09:44
-
That is what I mentioned. I guess he forgot to define property names explicitly. – Ali Ersöz Jan 12 '09 at 09:45
-
Thanks, but I got a new error: The type arguments for method 'System.Linq.Queryable.Union
(System.Linq.IQueryable – Jan 12 '09 at 09:46, System.Collections.Generic.IEnumerable )' cannot be inferred from the usage. Try specifying the type arguments explicitly. -
-
Try specifying the type arguments explicitly. That is the exact error. You forgot it I think. – Ali Ersöz Jan 12 '09 at 09:48
-
By the way, casting to IQueryable is not the need. IQueryable itself inherits IEnumarable – Ali Ersöz Jan 12 '09 at 09:54
-
-
I've tried that. As 'AsQueryable()' also you don't need to 'AsEnumerable()' in the code you gave. – Ali Ersöz Jan 12 '09 at 10:04
-
Yes it is not needed ,if you remove AsEnumerable, it returns IQueryable of course. – Dincer Uyav Jan 12 '09 at 10:14
-
Hmm, I just looked at IQueryable
and it has two overloads. One returns IQueryable – Ali Ersöz Jan 12 '09 at 10:57and the other from IEnumerable returns IEnumrable . So this makes the discussion meaningful, I guess.