当我执行返回匿名类型
的查询时 var assets =
from Product p in Session.CreateLinq<Product>()
where bundles.Contains(p.ProductBundle)
select new {p.Asset, p.Asset.PropertyTbl};
我可以输入除var以外的其他内容吗?
答案 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)
您可以使用object
或dynamic
(在.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();