Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

LINQ and creating NON anonymous return values

Tags:

c#

linq

I think I understand returning records of an anonymous type from But in this I want to create NEW CatalogEntries, and set them from the values selected. (context is a Devart LinqConnect database context, which lets me grab a view).

My solution works, but it seems clumsy. I want to do this in one from statement.

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();

I just tried this:

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

But I get the following error:

Error 79 Cannot initialize type 'CatalogService.CatalogResults' with a collection initializer because it does not implement 'System.Collections.IEnumerable' C:\Users\ysg4206\Documents\Visual Studio 2010\Projects\CatalogService\CatalogService\CatalogService.svc.cs 91 25 CatalogService

I should tell you what the definition of the CatalogResults is that I want to return:

[DataContract]
public class CatalogResults
{
    CatalogEntry[] _results;

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

My mind is dull today, apologies to all. You are being helpful. The end result is going to be serialized by WCF to a JSON structure, I need the array wrapped in a object with some information about size, etc.

like image 1000
Dr.YSG Avatar asked Sep 16 '25 05:09

Dr.YSG


2 Answers

Since .NET 3.0 you can use object initializer like shown below:

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

So if this is only one place where you are using CatalogEntry property setters - make all properties read-only so CatalogEntry will be immutable.

MSDN, Object initializer:

Object initializers let you assign values to any accessible fields or properties of an object at creation time without having to explicitly invoke a constructor.

like image 181
sll Avatar answered Sep 18 '25 19:09

sll


The trick here is to create a IQueryable, and then take the FirstOrDefault() value as your response (if you want a single response) or ToArray() (if you want an array). The error you are getting (Error 79 Cannot initialize type 'CatalogService.CatalogResults' with a collection initializer because it does not implement 'System.Collections.IEnumerable') is because you're trying to create an IEnumerable within the CatalogEntry object (by referencing the item variable).

    var response = (from item in context.Viewbostons
                 select new CatalogEntry() 
                 {
                     idx = item.Idx,
                     product = item.Product,
                     size = (long)item.SizeBytes,
                     ...
                  }).ToArray();
like image 22
bryanjonker Avatar answered Sep 18 '25 20:09

bryanjonker