关于LINQ:如何将新记录添加到IQueryable变量?

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

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

如果使用IQueryable,必须先将其转换为IEnumerable

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