title: C# Anonymous type foreach loop, a better way?
body: <p>I have this simple <code>foreach</code> loop of an anonymous type and I'm wondering if there is a way to make it more efficient. </p>
  
  <p>If it loops through 155 items, it takes about 20 seconds to complete. I've omitted some of the other properties it's setting on the <code>boAsset</code> object, but nothing special - just <code>Strings</code>/<code>Integers</code>.</p>
  
  <p>Any thoughts?</p>
  
  <pre><code>List&lt;BoAsset&gt; assetList = new List&lt;BoAsset&gt;();
  foreach (var asset in result)
  {
       BoAsset boAsset = new BoAsset();
       boAsset.Description = asset.Description;
       boAsset.DetailedDescription = asset.DetailedDescription;
       boAsset.AssetCustomerID = asset.AssetCustomerID;
       boAsset.AssetId = asset.AssetId;
       boAsset.Keywords = asset.Keywords;
       boAsset.Notes = asset.Notes;
       boAsset.Photographer = asset.Photographer;
       boAsset.PhotographerEmail = asset.PhotographerEmail;
       boAsset.Notes = asset.Notes;
       boAsset.Author = asset.Author;
       boAsset.FileName = asset.FileName;
       boAsset.FileExtension = asset.FileExtension;
       boAsset.AssetCreateDate = asset.AssetCreateDate;
       boAsset.AssetExpireDate = asset.AssetExpireDate;
  
       assetList.Add(boAsset);
  }
  
  
  var query =   (from a in context.Assets
                join subAf1 in context.AssetFiles on new { aid = a.AssetID, ftid = 1 } equals new { aid = subAf1.AssetID, ftid = subAf1.AssetTypeID } into theAf1
                from Af1 in theAf1.DefaultIfEmpty()
                join subAf2 in context.AssetFiles on new { aid = a.AssetID, ftid = 2 } equals new { aid = subAf2.AssetID, ftid = subAf2.AssetTypeID } into theAf2
                from Af2 in theAf2.DefaultIfEmpty()
                join subAf3 in context.AssetFiles on new { aid = a.AssetID, ftid = 3 } equals new { aid = subAf3.AssetID, ftid = subAf3.AssetTypeID } into theAf3
                from Af3 in theAf3.DefaultIfEmpty()
                join subAf4 in context.AssetFiles on new { aid = a.AssetID, ftid = 4 } equals new { aid = subAf4.AssetID, ftid = subAf4.AssetTypeID } into theAf4
                from Af4 in theAf4.DefaultIfEmpty()
                join subAf5 in context.AssetFiles on new { aid = a.AssetID, ftid = 5 } equals new { aid = subAf5.AssetID, ftid = subAf5.AssetTypeID } into theAf5
                from Af5 in theAf5.DefaultIfEmpty()
                join subFp in context.FilePaths on new { fpid = Af1.FilePathID } equals new { fpid = subFp.FilePathID } into theFp1
                from fp1 in theFp1.DefaultIfEmpty()
                //join fp in context.FilePaths on Af1.FilePathID equals fp.FilePathID
  
                where a.AssetCustomerID == custId &amp;&amp; a.AssetID == assetId
                select new { a, Af1, Af2, Af3, Af4, Af5, fp1 }).Distinct();
  
  var result =   from q in query
                 select new
                 {
                     AssetId = q.a.AssetID,
                     AssetCustomerId = q.a.AssetCustomerID,
                     StockImage = q.a.StockImage,
                     Description = q.a.Description,
                     DetailedDescription = q.a.DetailedDescription,
                     Author = q.a.Author,
                     FileName = q.Af1.FileName, //was 1
                     FileExtension = q.Af1.FileExtension, //was 1
                     AssetCreateDate = q.a.AssetCreateDate,
                     AssetExpireDate = q.a.AssetExpireDate,
                     AssetActivateDate = q.a.AssetActivateDate,
  
                     Notes = q.a.Notes,
                     Keywords = q.a.Keywords,
                         Photographer = q.a.Photographer,
                         PhotographerEmail = q.a.PhotographerEmail
                 }
  </code></pre>