LINQ和创建NON匿名返回值

本文关键字:返回值 NON 创建 LINQ | 更新日期: 2023-09-27 18:28:22

我想我理解从返回匿名类型的记录,但在这个过程中,我想创建NEW CatalogEntries,并根据所选值设置它们。(上下文是Devart LinqConnect数据库上下文,它让我可以获取视图)。

我的解决方案有效,但看起来很笨拙。我想在一个from声明中做到这一点。

var query = from it in context.Viewbostons
            select it;
foreach (GPLContext.Viewboston item in query)
{
    CatalogEntry card = new CatalogEntry();
    card.idx = item.Idx;
    card.product = item.Product;
    card.size = (long)item.SizeBytes;
    card.date = item.Date.ToString();
    card.type = item.Type;
    card.classification = item.Classification;
    card.distributor = item.Distributor;
    card.egplDate = item.EgplDate.ToString();
    card.classificationVal = (int)item.ClassificationInt;
    card.handling = item.Handling;
    card.creator = item.Creator;
    card.datum = item.Datum;
    card.elevation = (int)item.ElevationFt;
    card.description = item.Description;
    card.dirLocation = item.DoLocation;
    card.bbox = item.Bbox;
    card.uniqID = item.UniqId;
    values.Add(card);
}
CatalogResults response = new CatalogResults();

我刚试过这个:

        var query2 = from item in context.Viewbostons
                     select new CatalogResults
                    { item.Idx,
                        item.Product,
                        (long)item.SizeBytes,
                        item.Date.ToString(),
                        item.Type,
                        item.Classification,
                        item.Distributor,
                        item.EgplDate.ToString(),
                        (int)item.ClassificationInt,
                        item.Handling,
                        item.Creator,
                        item.Datum,
                        (int)item.ElevationFt,
                        item.Description,
                        item.DoLocation,
                        item.Bbox,
                        item.UniqId
                    };

但我得到以下错误:

错误79无法使用初始化类型"CatalogService.CatalogResults"集合初始值设定项,因为它未实现'System.Collections.IEnumerable'C:''Users''ysg4206''Documents''Visual演播室2010''Projects''CatalogService''CatalogService.svc.cs 91 25 CatalogService

我应该告诉你我想返回的CatalogResults的定义是什么:

[DataContract]
public class CatalogResults
{
    CatalogEntry[] _results;
    [DataMember]
    public CatalogEntry[] results
    {
        get { return _results; }
        set { _results = value; }
    }
}

我今天头脑迟钝,向大家道歉。你很乐于助人。最终结果将由WCF序列化为JSON结构,我需要将数组封装在一个包含一些大小信息的对象中。

LINQ和创建NON匿名返回值

由于.NET 3.0,您可以使用如下所示的对象初始值设定项:

var catalogResults = new CatalogResults 
   {
      results = context.Viewbostons
                       .Select(it => new CatalogEntry 
                          {
                            idx = it.Idx,
                            product = it.Product,
                            ...
                          })
                       .ToArray()
   };

因此,如果这只是使用CatalogEntry属性设置器的一个地方,请将所有属性设置为只读,这样CatalogEntry将是不可变的。

MSDN,对象初始值设定项:

对象初始值设定项允许您将值分配给对象,而不必显式调用构造函数。

这里的技巧是创建一个IQueryable,然后将FirstOrDefault()值作为响应(如果您想要一个响应)或ToArray(如果您需要一个数组)。您收到的错误(错误79无法使用集合初始值设定项初始化类型"CatalogService.CatalogResults",因为它未实现"System.Collections.IEnumerable")是因为您正试图在CatalogEntry对象内创建IEnumeraable(通过引用变量)。

    var response = (from item in context.Viewbostons
                 select new CatalogEntry() 
                 {
                     idx = item.Idx,
                     product = item.Product,
                     size = (long)item.SizeBytes,
                     ...
                  }).ToArray();

您不必在Linq select中创建匿名类型。您可以指定您的真实类型。

var query = context.Viewbostons.Select( it => 
    new CatalogEntry
    {
       idx = it.idx,
       ... etc
    });

这应该有效:

var query = from it in context.Viewbostons
            select new CatalogEntry()
            {
                // ...
            };