2013-06-05 61 views
5

我有匿名类型,我从我的数据库中获取的列表:创建一个新的匿名类型列表工会在现有的匿名类型列表

var takenChannels = (from b in bq.GetStuff(db) 
        where b.RecordType == "H" && b.TourStartDateTime.Date == date 
        select new { Start = b.TourStartDateTime, End = b.TourEndDateTime, Channel = b.RadioChannel, TourArea = b.TourArea }).ToList(); 

然后用这个表信息做一些东西在foreach循环。当我回到循环中时,我想添加一个新的匿名项目。

喜欢的东西:

takenChannels.Union{new[] { new{Start = DateTime.Now, End = DateTime.Now.AddDays(1), Channel = 25, TourArea = "Area" }}); 

显然,这是行不通的。我该怎么做?

编辑1:

takenChannels.Add(new { Start = s, End = e, Channel = channel, TourArea = booking.TourArea }); 

这是我走到这一步(感谢丹尼尔)最接近的...但我得到的错误是:

错误6论证1:无法从'AnonymousType#2'转换为'AnonymousType#1'

+2

'显然,这并不work.'不,这不是很明显。这是否会产生错误?如果是这样,什么?我不会怀疑它不起作用。请注意,'Union'不会改变列表,它会创建一个新的序列,因此您需要将其分配给某些内容以观察结果。 – Servy

+0

对不起,我一直在搞我的代码。这里有2个尝试解决方案的混搭。我编辑了我的Q. – Smithy

+2

属性的类型必须正确匹配。也许其中一个是一个地方的字符串,另一个是int,或者类似的东西。如果你确保你有*完全相同的属性*相同的名称和*完全相同的类型,那么它会工作得很好。 – Servy

回答

9

这个答案可能有点晚了,但由于这是谷歌搜索同样的问题时,我发现这个问题,我想我应该有一个工作的答案完成它。

还有就是Union通过匿名类型多次没有问题。在所有实例中声明所有属性并且它们具有相同的数据类型非常重要。如果没有,你会得到上面的错误。

  • 在您的具体情况,并在数据库可能返回TourStartDateTimeTourEndDateTimeDateTime?
  • RadioChannelint从数据库中或可能是int?string
  • TourArea在数据库中string

只需确保数据类型匹配,你应该罚款。下面是代码,我在我自己的程序中使用的工作片段:

var regions = (
    new[] { new { Id = "-1", Name = "---", Pattern = (string)null } } 
).Union(
    from x in db.Userlists where x.ListType == 2 select new { Id = x.UserlistID.ToString(), Name = x.Name, Pattern = (string)null } 
).Union(
    from x in db.Lookups where x.Category == "Stock" select new { Id = x.Key, Name = x.Key, Pattern = x.Value } 
).ToArray(); 
+0

非常感谢Mattias。 –

3

您可以简单地将Add添加到列表中:

takenChannels.Add(new { Start = ... }); 
+1

我可以添加...确保您添加的匿名类型对象的名称和类型与列表项相同。 – Les