可以将此Linq查询键入除“var”之外的任何内容吗?

时间:2010-07-27 08:36:39

标签: c# linq anonymous-types var

当我执行返回匿名类型

的查询时
    var assets =
        from Product p in Session.CreateLinq<Product>()
        where bundles.Contains(p.ProductBundle)
        select new {p.Asset, p.Asset.PropertyTbl};

我可以输入除var以外的其他内容吗?

7 个答案:

答案 0 :(得分:6)

你不能*返回一个匿名类型,因为调用者不知道它是什么类型,也无法使用它。

如果要返回结果,可以创建非匿名类型的对象:

IEnumerable<Foo> assets =
    from Product p in Session.CreateLinq<Product>()
    where bundles.Contains(p.ProductBundle)
    select new Foo { Bar = p.Asset, Baz = p.Asset.PropertyTbl};

如果您不想为值创建自定义类,也可以在.NET 4中使用Tuple类型。


*这不是严格正确的 - 这是可能的,但你应该避免这样做。如果你真的想要的话,这里有一个link

答案 1 :(得分:4)

您可以使用objectdynamic(在.NET 4.0中)而不是var,但不希望找到匿名类型的名称。在你的情况下使用var更好,因为它将保留强类型,至少在你离开当前方法的范围之前。

答案 2 :(得分:1)

您可以定义一个新类:

public class AssetProp
{
   public virtual string Asset {get;set;}
   public virtual string PropertyTbl {get;set;}
}

然后你可以把它作为那个类返回:

IEnumerable<AssetProp> assets =
    from Product p in Session.CreateLinq<Product>()
    where bundles.Contains(p.ProductBundle)
    select new AssetProp {p.Asset, p.Asset.PropertyTbl};

答案 3 :(得分:0)

不是真的。如果你转换为对象,你将无法访问匿名类的属性。

var关键字是专门为处理匿名类而引入的 - 为什么要避免使用它?如果您需要返回数据,则应该为该类命名。

答案 4 :(得分:0)

不是真的,因为new {p.Asset, p.Asset.PropertyTbl}代码会创建一个匿名类型。即使使用object也不会给你带来太大的好处,因为你以后无法将其转换为任何有用的东西,所以你必须使用反射来访问属性。

答案 5 :(得分:0)

如果你使用lambda expressions,你可以使用,否则你可以进行演员表但是做一些很好的异常处理。

答案 6 :(得分:0)

你也可以这样做(它确实与你的问题有很大关系,因为你只是在其他地方移动“var”,但有趣的是它将这些类型识别为相同)

        var element = new { id = 7 };

        List<object> collection = new List<object>();
        element = collection.Select(item => new { id = 0 }).First();