无法将手动匿名项添加到IQueryable

时间:2012-11-15 13:33:21

标签: c# linq iqueryable

fromI有这个linq查询从IQueryable构建一个json(string和bool?):

var ret = from c in results select new { country = c.EN, schengen = c.Schengen };

我想手动添加新项目:(伪代码)

ret = ret /* add this -> */ { country = "some new country", schengen = true }

我试过这样做:

//End up with cannot convert from AnonymousType#2 to AnonymousType#1
var listRet = ret.ToList();
listRet.Add(new { country ="", schengen = true });

因为它是我构建的匿名类型,所以无法找到添加它的方法。我总是以转换错误

结束

3 个答案:

答案 0 :(得分:2)

嗯,很明显。泛型是不变的。所以另一种类型不适合。您可以使用List<object>或命名类来存储值。

答案 1 :(得分:2)

匿名类型仍然是静态类型,C#编译器为每个匿名类型定义事件生成一个单独的类。在这种情况下,您需要一个命名类。无论如何,这是数据传输对象的一个​​好习惯。我使用这样的JSON DTO,使用数据注释和DataContractJsonSerializer。

[DataContract]
public class CountryInfo
{
    [DataMember(Name = "country")]
    public string Country { get; set; }

    [DataMember(Name = "schengen", EmitDefaultValue = false)
    public bool? Schengen { get; set; }
}

这样我就有了一个记录完备的JSON“协议”,它在序列化之前也使用了C#命名约定,但是之后的JS命名约定。

答案 2 :(得分:1)

如果要手动更改结果,则需要将其转换为静态类型而不是动态类型。创建一个具有字符串country和bool schengen的类(您甚至可以在当前类中创建该类以将其隐藏在应用程序的其余部分(如果适用)),将您的linq结果转换为该类,然后添加到该类中。