如何将新记录添加到IQueryable变量?

时间:2009-01-12 07:50:20

标签: linq iqueryable

使用LINQ从我的数据库中查询IQueryable结果,如何向IQueryable结果添加新记录。

8 个答案:

答案 0 :(得分:37)

是否要将其添加到数据库中,或仅添加到数据绑定等其他内容的结果列表中?

如果是前者,则需要对正在使用的任何类型的LINQ使用正常的添加操作,而不是使用表格表示而不是IQueryable。查询只读取数据。

如果是后者,请使用Enumerable.Concat将现有序列(IQueryable)连接到一个包含额外条目的新序列(数组在这里可以正常工作或列表),并使用结果进行绑定首先使用AsEnumerable()来确保使用Enumerable而不是Queryable是值得的。例如:

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

答案 1 :(得分:13)

您应该先将其转换为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});
编辑:确定你必须重新分配foo。

答案 2 :(得分:5)

简单的答案是,除非您将记录添加到Iqueryable正在查询的基础数据存储区,否则无法将新记录添加到IQueryable中。因此,如果您正在使用LinqToSql,那么您必须在IQueryable正在查询的表中添加一行,以便在IQueryable中“添加”一行。

请记住,IQueryable不是结果集,而是查询。在使用.ToList()之类的东西之前,IQueryable不会评估结果集,更重要的是,IQueryable不会挂起到该结果集。它会创建一个列表并将结果放入其中。这意味着如果你在Iqueryable上调用ToList()两次,它将关闭并查询数据库两次。它并不关心它可能效率低下。

因此,如果您查看其他人上面使用的示例,将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 :(得分:3)

这可能是一个非常古老的问题,我想在此处添加更多解释和示例

如果您使用IQueryable<YourObject>,则必须先将其转换为IEnumerable<YourObject>

  

关于IEnumerable的补充细节:

     

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

答案 4 :(得分:1)

试试这个:

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

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

答案 5 :(得分:0)

明确设置匿名类型的属性。试试这个:

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

答案 6 :(得分:0)

因为结果是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 =“请选择   你的性别“}})

答案 7 :(得分:0)

您可以使用工会

IQueryable<int> foo = new SomeQueryable<int>();
IQueryable<int> foo2 = new SomeQueryable<int>();
foo = foo.Union(foo2);