How do I add a new record to an IQueryable variable?
使用LINQ从我的数据库中查询IQueryable结果,如何向IQueryable结果添加新记录。
是要将其添加到数据库中,还是只添加到数据绑定等其他操作将使用的结果列表中?
如果是前者,则需要对所使用的任何类型的LINQ使用普通的添加操作,但要对表表示而不是iqueryable使用普通的添加操作。只查询读取的数据。
如果是后者,请使用Enumerable.Concat将现有序列(iQueryable)与包含额外条目的新序列(此处的数组或列表很好)连接起来,并使用绑定结果等。可能需要首先使用AsEnumerable()以确保使用Enumerable而不是Queryable。例如:
1 2 | IQueryable<string> names = [...]; names = names.AsEnumerable().Concat(new[] {"(None)","(Add new)" }); |
你应该先把它转换成列表;
1 2 3 | IQueryable<int> foo = new SomeQueryable<int<(); List<int> list = foo.ToList(); list.Add(5); |
或者使用concat
1 2 | IQueryable<int> foo = new SomeQueryable<int<(); foo = foo.Concat(new int[]{5}); |
编辑:确定要重新分配foo。
简单的答案是,除非将记录添加到IQueryable正在查询的基础数据存储中,否则无法将新记录添加到IQueryable中。因此,如果您使用的是LinqToSQL,那么您必须向IQueryable查询的表中添加一行,以便将一行"添加"到IQueryable中。
请记住,IQueryable不是结果集,而是查询。在使用类似于.tolist()的方法之前,iqueryable不会对结果集进行评估,更重要的是,iqueryable不会挂起该结果集。它创建一个列表并将结果放入。这意味着,如果对iQueryable调用tolist()两次,它将关闭并查询数据库两次。它不在乎它可能效率低下。
因此,如果您查看上面其他人使用的示例,将asEnumerable()简单更改为toList()将很可能解决您的问题。
类似:
1 2 3 4 5 6 7 8 9 10 | 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"); |
这可能是一个非常古老的问题,我想在这里添加更多的解释和示例
如果使用
addition detail about IEnumerable:
Returning IEnumerable
vs. IQueryable
通过
1 2 | IQueryable<YourObject> iqueryResult = // ..... your LinQ or whatever IEnumerable<YourObject> enumResult = iqueryResult.AsEnumerable(); |
然后,再补充一点,你可以通过
1 2 3 4 5 | enumResult = enumResult.Concat(new[] {new YourObject() { //.... } }); |
实码样本
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | 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 2 3 | var query = from c in db.clClinics select c; var results = query.ToList().Concat(new clClinic[] { new clClinic()}); |
你可以用union
1 2 3 | IQueryable<int> foo = new SomeQueryable<int>(); IQueryable<int> foo2 = new SomeQueryable<int>(); foo = foo.Union(foo2); |
因为结果是可查询的,所以您应该将其强制转换为
1 2 3 4 5 | 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 ="Please select
your Gender"} })
显式设置匿名类型的属性。试试这个:
1 2 3 4 5 | 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,你必须指出它是int。我猜sexcode是"long",默认情况下-1是"int"。如果您将-1转换为long(或sexcode的类型),问题将得到解决。
如果sexcode的类型是long,这里是确切的解决方案。
1 2 3 4 5 | 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"); |