代码之家  ›  专栏  ›  技术社区  ›  Mike Q

这个Linq查询是否可以键入“var”以外的任何类型?

  •  3
  • Mike Q  · 技术社区  · 14 年前

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

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

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

    7 回复  |  直到 14 年前
        1
  •  6
  •   Mark Byers    14 年前

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

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

    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};
    

    您也可以使用 Tuple 如果不想为值创建自定义类,请键入.NET4。


    link

        2
  •  4
  •   Darin Dimitrov    14 年前

    你可以用 object dynamic var 但不要期望找到匿名类型的名称。在你的情况下使用 变量

        3
  •  1
  •   djdd87    14 年前

    您可以定义一个新类:

    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};
    
        4
  •  0
  •   corvuscorax    14 年前

    不是真的,因为 new {p.Asset, p.Asset.PropertyTbl} 代码创建匿名类型。甚至使用 object 由于以后无法将其转换为任何有用的内容,因此实际上不会给您带来太多好处,因此必须使用反射来访问属性。

        5
  •  0
  •   Janus Tøndering    14 年前

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

        6
  •  0
  •   Nealv    14 年前

    如果你使用 lambda expressions ,否则您可以执行强制转换,但可以执行一些良好的异常处理。

        7
  •  0
  •   Kikaimaru    14 年前

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

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