当我执行返回匿名类型的查询时
var assets =
from Product p in Session.CreateLinq<Product>()
where bundles.Contains(p.ProductBundle)
select new {p.Asset, p.Asset.PropertyTbl};
我可以输入除 var 以外的任何内容的返回值吗?
当我执行返回匿名类型的查询时
var assets =
from Product p in Session.CreateLinq<Product>()
where bundles.Contains(p.ProductBundle)
select new {p.Asset, p.Asset.PropertyTbl};
我可以输入除 var 以外的任何内容的返回值吗?
你不能*返回一个匿名类型,因为调用者不知道它是什么类型并且不能使用它。
如果要返回结果,可以创建非匿名类型的对象:
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类型。
* 这并不完全正确 - 有可能,但您应该避免这样做。无论如何,如果您真的想要,这里有一个链接。
您可以使用object
or dynamic
(在 .NET 4.0 中)代替var
但不要期望找到匿名类型的名称。在您的情况下,使用var
更好,因为它至少会保留强类型,直到您离开当前方法的范围。
您可以定义一个新类:
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};
您也可以这样做(尽管它确实与您的问题有很大关系,因为您只是将“var”移动到其他地方,但有趣的是它将这些类型识别为相同)
var element = new { id = 7 };
List<object> collection = new List<object>();
element = collection.Select(item => new { id = 0 }).First();
不是真的,因为new {p.Asset, p.Asset.PropertyTbl}
代码创建了一个匿名类型。即使使用object
也不会真正为您带来太多好处,因为您以后无法将其转换为任何有用的东西,因此您必须使用反射来访问属性。
如果您使用lambda 表达式,则可以,否则您可以进行强制转换,但可以进行一些良好的异常处理。
并不真地。如果您强制转换为对象,您将无法访问匿名类的属性。
var 关键字是专门为处理匿名类而引入的——为什么要避免它?如果您需要返回数据,您应该命名该类。