3

当我执行返回匿名类型的查询时

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

我可以输入除 var 以外的任何内容的返回值吗?

4

7 回答 7

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类型。


* 这并不完全正确 - 有可能,但您应该避免这样做。无论如何,如果您真的想要,这里有一个链接。

于 2010-07-27T08:39:36.280 回答
4

您可以使用objector dynamic(在 .NET 4.0 中)代替var但不要期望找到匿名类型的名称。在您的情况下,使用var更好,因为它至少会保留强类型,直到您离开当前方法的范围。

于 2010-07-27T08:38:31.287 回答
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};
于 2010-07-27T08:40:40.713 回答
0

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

        var element = new { id = 7 };

        List<object> collection = new List<object>();
        element = collection.Select(item => new { id = 0 }).First();
于 2010-07-27T09:17:17.660 回答
0

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

于 2010-07-27T08:42:21.323 回答
0

如果您使用lambda 表达式,则可以,否则您可以进行强制转换,但可以进行一些良好的异常处理。

于 2010-07-27T08:47:20.890 回答
0

并不真地。如果您强制转换为对象,您将无法访问匿名类的属性。

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

于 2010-07-27T08:39:52.737 回答