Quantcast
Channel: MSDN Blogs
Viewing all articles
Browse latest Browse all 29128

“Windows 8.1 におけるストア ビジネスアプリの開発”(MVP Community Camp 2014)DEMO解説 #4:データアクセス・認証と疎結合コンポーネント間通信

$
0
0

皆様、こんにちは!今回は、データアクセス・認証疎結合コンポーネント間通信のデモを取り上げます。次のユーザー入力の検証でこのデモ解説は終了です。今回も冒頭はスライドシェアのリンクです。

<Windows 8.1 におけるストア ビジネスアプリの設計と開発>

Prism for Windowr Runtime では、スライドにある通り、こちらのアプリケーション データの管理の箇所が関連します。

http://msdn.microsoft.com/ja-jp/library/windows/apps/xx130650.aspx

さて、この部分のスライドでは、ローカルデータ・リモートデータの扱い認証の話、それから、ASP.NET Web API の利用、についてまとめてあります。

image

ローカルデータ・リモートデータの扱い

まずは、ストアアプリに関しては、データアクセスの選択肢の話があります。こちらは、全体像を見て戴ければと思います。

image

---  アプリケーション データの管理

Windows ストア アプリが接続できる Web サービスを実装するにはさまざまな方法があります。

  • Window Azure のモバイル サービスを使うと、Windows ストア アプリにクラウドベースのサービスを追加できます。詳しくは、Window Azure のモバイル サービスのデベロッパー センターをご覧ください。
  • Windows Communication Foundation (WCF) を使うと、SOAP ベースの Web サービスを開発できます。これらのサービスでは、サービスをトランスポート プロトコルから分離することに重点が置かれています。そのため、さまざまなエンドポイントとさまざまなプロトコルを使って同じサービスを公開できます (TCP、ユーザー データグラム プロトコル (UDP)、HTTP、Secure HTTP (HTTPS)、メッセージ キューなど)。ただし、この柔軟性を実現するために多くの構成と属性が使われるため、インフラストラクチャを簡単に検証できなくなる場合があります。さらに、サービスの入力モデルや出力モデルが変更されるたびに新しいクライアント プロキシを生成する必要があります。
  • ASP.NET Web API を使うと、HTTP で直接公開される Web サービスを開発できるため、アプリケーション レイヤー プロトコルとしての HTTP をフル活用できます。開発した Web サービスは、アプリ、ブラウザー、バックエンド サービスなど、幅広いクライアントと通信できます。ASP.NET Web API は、REST を使って作成されたアプリをサポートするように設計されていますが、RESTful アーキテクチャの使用は強制されません。そのため、サービスの入力モデルや出力モデルが変更された場合、クライアントでは、Web サービスに送信するクエリ文字列や Web サービスから受け取るデータの解析方法を変更するだけで済みます。

WCF と ASP.NET Web API の最大の違いは、WCF が SOAP に基づいているのに対して ASP.NET Web API は HTTP に基づいていることです。HTTP には次の利点があります。

  • 操作を定義する動詞をサポートしています。たとえば、情報を照会するには GET を使い、情報を作成するには POST を使います。
  • 意味のある説明的なメッセージ ヘッダーが含まれています。たとえば、ヘッダーからメッセージ本文のコンテンツの種類がわかります。
  • XML コンテンツに限定される SOAP とは違ってあらゆる種類のコンテンツを使用できる本文が含まれています。HTTP メッセージの本文では、HTML、XML、JavaScript Object Notation (JSON)、バイナリ ファイルなど、あらゆる種類のコンテンツを使用できます。
  • リソースと操作の両方を Uniform Resource Identifier (URI) を使って識別します。

アプリで WCF と ASP.NET Web API のどちらを使えばよいかは、次の質問に答えることによって判断できます。

  • 作成するサービスで、一方向メッセージング、メッセージ キュー、双方向通信などの特殊なシナリオをサポートしますか。その場合は、WCF を使う必要があります。
  • 作成するサービスで、高速なトランスポート チャネル (TCP、名前付きパイプ、UDP など) を使用できる場合は使いますか。その場合は、WCF を使う必要があります。
  • 作成するサービスで、高速なトランスポート チャネルを使用できる場合はそれを使い、他のトランスポート チャネルを使用できない場合は HTTP を使いますか。その場合は、WCF を使う必要があります。
  • オブジェクトを単純にシリアル化して送信し、送信先で同じ厳密に型指定されたオブジェクトとして逆シリアル化しますか。その場合は、WCF を使う必要があります。
  • HTTP 以外のプロトコルを使う必要がありますか。その場合は、WCF を使う必要があります。
  • 作成するサービスは、GET などの単純な操作指向の動詞によってアクティブ化され、HTML、XML、JSON 文字列、バイナリ データなどのコンテンツを送信することによって応答する、リソース指向のサービスですか。その場合は、ASP.NET Web API を使う必要があります。
  • 帯域幅の制限がありますか。その場合は、ASP.NET Web API と JSON を使う必要があります。そうすると、送信されるペイロードが SOAP に比べて小さくなります。
  • SOAP スタックを持たないクライアントをサポートする必要がありますか。その場合は、ASP.NET Web API を使う必要があります。

---

ASP.NET Web API の利用について

次に、この部分に関しては、論理アーキテクチャー図を見てください。

Prism を使う Windows ストア ビジネス アプリの論理アーキテクチャ

セッションでもお見せした通り、Adventure Works リファレンスサンプルソリューションを見て貰えればと思います。ソリューションエクスプローラーで、AdventureWorks.WebServicesとなっているプロジェクトを見てください。上記の図の、Cloud or Servicesのレイヤーに相当します。これ自体が、ASP.NET Web APIのプロジェクトになっています。このプロジェクト内の、Services Repositories 部分に実装されています。たとえば、Products(ここでは、自転車関連の商品)を例にとるとこんな感じですね。

Repositories フォルダ:ProductRepository.cs

   1:// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
   2:// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
   3:// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
   4:// PARTICULAR PURPOSE.
   5://
   6:// Copyright (c) Microsoft Corporation. All rights reserved
   7:  
   8:  
   9:using System;
  10:using System.Collections.Generic;
  11:using AdventureWorks.WebServices.Models;
  12:using System.Linq;
  13:  
  14:namespace AdventureWorks.WebServices.Repositories
  15: {
  16:publicclass ProductRepository : IProductRepository
  17:     {
  18:privatestaticstring ImageServerPath = System.Configuration.ConfigurationManager.AppSettings["ImageServerPath"];
  19:privatestatic ICollection<Product> _products = PopulateProducts();
  20:  
  21:privatestatic IEnumerable<Product> _todaysDealsProducts = GetTodaysDeals();
  22:  
  23:public IEnumerable<Product> GetProducts()
  24:         {
  25:lock (_products)
  26:             {
  27:// Return new collection so callers can iterate independently on separate threads
  28:return _products.ToArray();
  29:             }
  30:         }
  31:  
  32:public IEnumerable<Product> GetProductsForCategory(int subcategoryId)
  33:         {
  34:lock (_products)
  35:             {
  36:return _products.Where(p => p.SubcategoryId == subcategoryId).ToArray();
  37:             }
  38:         }
  39:  
  40:public IEnumerable<Product> GetTodaysDealsProducts()
  41:         {
  42:lock (_todaysDealsProducts)
  43:             {
  44:return _todaysDealsProducts.ToArray();
  45:             }
  46:         }
  47:  
  48:public Product GetProduct(string productNumber)
  49:         {
  50:lock (_products)
  51:             {
  52:return _products.FirstOrDefault(c => c.ProductNumber == productNumber);
  53:             }
  54:         }
  55:  
  56:privatestatic ICollection<Product> PopulateProducts()
  57:         {
  58:             var products = new List<Product>();
  59:             products.Add(new Product { Currency="USD", Title = "Mountain-500 Red, 40", ProductNumber="BK-M18S-40", SubcategoryId=1, Description="Suitable for any type of riding, on or off-road. Fits any budget. Smooth-shifting with a comfortable ride.", ListPrice=564.9900, Weight=27.35, Color="Silver", ImageUri = new Uri(ImageServerPath + "hotrodbike_red_large.jpg")});
  60:             products.Add(new Product { Currency="USD", Title = "Mountain-500 Red, 42", ProductNumber="BK-M18S-42", SubcategoryId=1, Description="Suitable for any type of riding, on or off-road. Fits any budget. Smooth-shifting with a comfortable ride.", ListPrice=564.9900, Weight=27.77, Color="Silver", ImageUri = new Uri(ImageServerPath + "hotrodbike_red_large.jpg")});
  61:             products.Add(new Product { Currency="USD", Title = "Mountain-500 Red, 44", ProductNumber="BK-M18S-44", SubcategoryId=1, Description="Suitable for any type of riding, on or off-road. Fits any budget. Smooth-shifting with a comfortable ride.", ListPrice=564.9900, Weight=28.13, Color="Silver", ImageUri = new Uri(ImageServerPath + "hotrodbike_red_large.jpg")});
  62:             products.Add(new Product { Currency="USD", Title = "Mountain-500 Red, 48", ProductNumber="BK-M18S-48", SubcategoryId=1, Description="Suitable for any type of riding, on or off-road. Fits any budget. Smooth-shifting with a comfortable ride.", ListPrice=564.9900, Weight=28.42, Color="Silver", ImageUri = new Uri(ImageServerPath + "hotrodbike_red_large.jpg")});
  63:             products.Add(new Product { Currency="USD", Title = "Mountain-500 Red, 52", ProductNumber="BK-M18S-52", SubcategoryId=1, Description="Suitable for any type of riding, on or off-road. Fits any budget. Smooth-shifting with a comfortable ride.", ListPrice=564.9900, Weight=28.68, Color="Silver", ImageUri = new Uri(ImageServerPath + "hotrodbike_red_large.jpg")});
  64:             products.Add(new Product { Currency="USD", Title = "Mountain-500 Black, 40", ProductNumber="BK-M18B-40", SubcategoryId=1, Description="Suitable for any type of riding, on or off-road. Fits any budget. Smooth-shifting with a comfortable ride.", ListPrice=539.9900, Weight=27.35, Color="Black", ImageUri = new Uri(ImageServerPath + "hotrodbike_black_large.jpg")});
  65:             products.Add(new Product { Currency="USD", Title = "Mountain-500 Black, 42", ProductNumber="BK-M18B-42", SubcategoryId=1, Description="Suitable for any type of riding, on or off-road. Fits any budget. Smooth-shifting with a comfortable ride.", ListPrice=539.9900, Weight=27.77, Color="Black", ImageUri = new Uri(ImageServerPath + "hotrodbike_black_large.jpg")});
  66:             products.Add(new Product { Currency="USD", Title = "Mountain-500 Black, 44", ProductNumber="BK-M18B-44", SubcategoryId=1, Description="Suitable for any type of riding, on or off-road. Fits any budget. Smooth-shifting with a comfortable ride.", ListPrice=539.9900, Weight=28.13, Color="Black", ImageUri = new Uri(ImageServerPath + "hotrodbike_black_large.jpg")});
  67:             products.Add(new Product { Currency="USD", Title = "Mountain-500 Black, 48", ProductNumber="BK-M18B-48", SubcategoryId=1, Description="Suitable for any type of riding, on or off-road. Fits any budget. Smooth-shifting with a comfortable ride.", ListPrice=539.9900, Weight=28.42, Color="Black", ImageUri = new Uri(ImageServerPath + "hotrodbike_black_large.jpg")});
  68:             products.Add(new Product { Currency="USD", Title = "Mountain-500 Black, 52", ProductNumber="BK-M18B-52", SubcategoryId=1, Description="Suitable for any type of riding, on or off-road. Fits any budget. Smooth-shifting with a comfortable ride.", ListPrice=539.9900, Weight=28.68, Color="Black", ImageUri = new Uri(ImageServerPath + "hotrodbike_black_large.jpg")});
  69:             products.Add(new Product { Currency="USD", Title = "Mountain-400-W Red, 42", ProductNumber="BK-M38S-42", SubcategoryId=1, Description="This bike delivers a high-level of performance on a budget. It is responsive and maneuverable, and offers peace-of-mind when you decide to go off-road.", ListPrice=769.4900, DiscountPercentage = 25, Weight=27.13, Color="Silver", ImageUri = new Uri(ImageServerPath + "hotrodbike_red_large.jpg")});
  70:             products.Add(new Product { Currency="USD", Title = "Mountain-400-W Red, 46", ProductNumber="BK-M38S-46", SubcategoryId=1, Description="This bike delivers a high-level of performance on a budget. It is responsive and maneuverable, and offers peace-of-mind when you decide to go off-road.", ListPrice=769.4900, Weight=27.42, Color="Red", ImageUri = new Uri(ImageServerPath + "hotrodbike_red_large.jpg")});
  71:             products.Add(new Product { Currency="USD", Title = "Mountain-400-W Red, 38", ProductNumber="BK-M38S-38", SubcategoryId=1, Description="This bike delivers a high-level of performance on a budget. It is responsive and maneuverable, and offers peace-of-mind when you decide to go off-road.", ListPrice=769.4900, Weight=26.35, Color="Red", ImageUri = new Uri(ImageServerPath + "hotrodbike_red_large.jpg")});
  72:             products.Add(new Product { Currency="USD", Title = "Mountain-400-W Red, 40", ProductNumber="BK-M38S-40", SubcategoryId=1, Description="This bike delivers a high-level of performance on a budget. It is responsive and maneuverable, and offers peace-of-mind when you decide to go off-road.", ListPrice=769.4900, Weight=26.77, Color="Red", ImageUri = new Uri(ImageServerPath + "hotrodbike_red_large.jpg")});
  73:             products.Add(new Product { Currency="USD", Title = "Mountain-300 Black, 38", ProductNumber="BK-M47B-38", SubcategoryId=1, Description="For true trail addicts.  An extremely durable bike that will go anywhere and keep you in control on challenging terrain - without breaking your budget.", ListPrice=1079.9900, Weight=25.35, Color="Black", ImageUri = new Uri(ImageServerPath + "hotrodbike_black_large.jpg")});
  74:             products.Add(new Product { Currency="USD", Title = "Mountain-300 Black, 40", ProductNumber="BK-M47B-40", SubcategoryId=1, Description="For true trail addicts.  An extremely durable bike that will go anywhere and keep you in control on challenging terrain - without breaking your budget.", ListPrice=1079.9900, Weight=25.77, Color="Black", ImageUri = new Uri(ImageServerPath + "hotrodbike_black_large.jpg")});
  75:             products.Add(new Product { Currency="USD", Title = "Mountain-300 Black, 48", ProductNumber="BK-M47B-48", SubcategoryId=1, Description="For true trail addicts.  An extremely durable bike that will go anywhere and keep you in control on challenging terrain - without breaking your budget.", ListPrice=1079.9900, Weight=26.42, Color="Black", ImageUri = new Uri(ImageServerPath + "hotrodbike_black_large.jpg")});
  76:             products.Add(new Product { Currency="USD", Title = "Mountain-200 Red, 38", ProductNumber="BK-M68S-38", SubcategoryId=1, Description="Serious back-country riding. Perfect for all levels of competition. Uses the same HL Frame as the Mountain-100.", ListPrice=2319.9900, Weight=23.35, Color="Red", ImageUri = new Uri(ImageServerPath + "hotrodbike_red_large.jpg")});
  77:             products.Add(new Product { Currency="USD", Title = "Mountain-200 Red, 42", ProductNumber="BK-M68S-42", SubcategoryId=1, Description="Serious back-country riding. Perfect for all levels of competition. Uses the same HL Frame as the Mountain-100.", ListPrice=2319.9900, Weight=23.77, Color="Red", ImageUri = new Uri(ImageServerPath + "hotrodbike_red_large.jpg")});
  78:             products.Add(new Product { Currency="USD", Title = "Mountain-200 Red, 46", ProductNumber="BK-M68S-46", SubcategoryId=1, Description="Serious back-country riding. Perfect for all levels of competition. Uses the same HL Frame as the Mountain-100.", ListPrice=2319.9900, Weight=24.13, Color="Red", ImageUri = new Uri(ImageServerPath + "hotrodbike_red_large.jpg")});
  79:             products.Add(new Product { Currency="USD", Title = "Mountain-200 Black, 38", ProductNumber="BK-M68B-38", SubcategoryId=1, Description="Serious back-country riding. Perfect for all levels of competition. Uses the same HL Frame as the Mountain-100.", ListPrice=2294.9900, Weight=23.35, Color="Black", ImageUri = new Uri(ImageServerPath + "hotrodbike_black_large.jpg")});
  80:             products.Add(new Product { Currency="USD", Title = "Mountain-200 Black, 42", ProductNumber="BK-M68B-42", SubcategoryId=1, Description="Serious back-country riding. Perfect for all levels of competition. Uses the same HL Frame as the Mountain-100.", ListPrice=2294.9900, Weight=23.77, Color="Black", ImageUri = new Uri(ImageServerPath + "hotrodbike_black_large.jpg")});
  81:             products.Add(new Product { Currency="USD", Title = "Mountain-200 Black, 46", ProductNumber="BK-M68B-46", SubcategoryId=1, Description="Serious back-country riding. Perfect for all levels of competition. Uses the same HL Frame as the Mountain-100.", ListPrice=2294.9900, Weight=24.13, Color="Black", ImageUri = new Uri(ImageServerPath + "hotrodbike_black_large.jpg")});
  82:             products.Add(new Product { Currency="USD", Title = "Mountain-100 Red, 38", ProductNumber="BK-M82S-38", SubcategoryId=1, Description="Top-of-the-line competition mountain bike. Performance-enhancing options include the innovative HL Frame, super-smooth front suspension, and traction for all terrain.", ListPrice=3399.9900, Weight=20.35, Color="Red", ImageUri = new Uri(ImageServerPath + "hotrodbike_red_large.jpg")});
  83:             products.Add(new Product { Currency="USD", Title = "Mountain-100 Red, 42", ProductNumber="BK-M82S-42", SubcategoryId=1, Description="Top-of-the-line competition mountain bike. Performance-enhancing options include the innovative HL Frame, super-smooth front suspension, and traction for all terrain.", ListPrice=3399.9900, Weight=20.77, Color="Red", ImageUri = new Uri(ImageServerPath + "hotrodbike_red_large.jpg")});
  84:             products.Add(new Product { Currency="USD", Title = "Mountain-100 Red, 44", ProductNumber="BK-M82S-44", SubcategoryId=1, Description="Top-of-the-line competition mountain bike. Performance-enhancing options include the innovative HL Frame, super-smooth front suspension, and traction for all terrain.", ListPrice=3399.9900, Weight=21.13, Color="Red", ImageUri = new Uri(ImageServerPath + "hotrodbike_red_large.jpg")});
  85:             products.Add(new Product { Currency="USD", Title = "Mountain-100 Red, 48", ProductNumber="BK-M82S-48", SubcategoryId=1, Description="Top-of-the-line competition mountain bike. Performance-enhancing options include the innovative HL Frame, super-smooth front suspension, and traction for all terrain.", ListPrice=3399.9900, Weight=21.42, Color="Red", ImageUri = new Uri(ImageServerPath + "hotrodbike_red_large.jpg")});
  86:             products.Add(new Product { Currency="USD", Title = "Mountain-100 Black, 38", ProductNumber="BK-M82B-38", SubcategoryId=1, Description="Top-of-the-line competition mountain bike. Performance-enhancing options include the innovative HL Frame, super-smooth front suspension, and traction for all terrain.", ListPrice=3374.9900, Weight=20.35, Color="Black", ImageUri = new Uri(ImageServerPath + "hotrodbike_black_large.jpg")});
  87:             products.Add(new Product { Currency="USD", Title = "Mountain-100 Black, 42", ProductNumber="BK-M82B-42", SubcategoryId=1, Description="Top-of-the-line competition mountain bike. Performance-enhancing options include the innovative HL Frame, super-smooth front suspension, and traction for all terrain.", ListPrice=3374.9900, Weight=20.77, Color="Black", ImageUri = new Uri(ImageServerPath + "hotrodbike_black_large.jpg")});
  88:             products.Add(new Product { Currency="USD", Title = "Mountain-100 Black, 44", ProductNumber="BK-M82B-44", SubcategoryId=1, Description="Top-of-the-line competition mountain bike. Performance-enhancing options include the innovative HL Frame, super-smooth front suspension, and traction for all terrain.", ListPrice=3374.9900, Weight=21.13, Color="Black", ImageUri = new Uri(ImageServerPath + "hotrodbike_black_large.jpg")});
  89:             products.Add(new Product { Currency="USD", Title = "Mountain-100 Black, 48", ProductNumber="BK-M82B-48", SubcategoryId=1, Description="Top-of-the-line competition mountain bike. Performance-enhancing options include the innovative HL Frame, super-smooth front suspension, and traction for all terrain.", ListPrice=3374.9900, Weight=21.42, Color="Black", ImageUri = new Uri(ImageServerPath + "hotrodbike_black_large.jpg")});
  90:             products.Add(new Product { Currency="USD", Title = "Road-750 Black, 58", ProductNumber="BK-R19B-58", SubcategoryId=2, Description="Entry level adult bike; offers a comfortable ride cross-country or down the block. Quick-release hubs and rims.", ListPrice=539.9900, Weight=20.79, Color="Black", ImageUri = new Uri(ImageServerPath + "roadster_black_large.jpg")});
  91:             products.Add(new Product { Currency="USD", Title = "Road-750 Black, 44", ProductNumber="BK-R19B-44", SubcategoryId=2, Description="Entry level adult bike; offers a comfortable ride cross-country or down the block. Quick-release hubs and rims.", ListPrice=539.9900, Weight=19.77, Color="Black", ImageUri = new Uri(ImageServerPath + "roadster_black_large.jpg")});
  92:             products.Add(new Product { Currency="USD", Title = "Road-750 Black, 48", ProductNumber="BK-R19B-48", SubcategoryId=2, Description="Entry level adult bike; offers a comfortable ride cross-country or down the block. Quick-release hubs and rims.", ListPrice=539.9900, Weight=20.13, Color="Black", ImageUri = new Uri(ImageServerPath + "roadster_black_large.jpg")});
  93:             products.Add(new Product { Currency="USD", Title = "Road-750 Black, 52", ProductNumber="BK-R19B-52", SubcategoryId=2, Description="Entry level adult bike; offers a comfortable ride cross-country or down the block. Quick-release hubs and rims.", ListPrice=539.9900, Weight=20.42, Color="Black", ImageUri = new Uri(ImageServerPath + "roadster_black_large.jpg")});
  94:             products.Add(new Product { Currency="USD", Title = "Road-650 Red, 58", ProductNumber="BK-R50R-58", SubcategoryId=2, Description="Value-priced bike with many features of our top-of-the-line models. Has the same light, stiff frame, and the quick acceleration we're famous for.", ListPrice=782.9900, Weight=19.79, Color="Red", ImageUri = new Uri(ImageServerPath + "roadster_red_large.jpg")});
  95:             products.Add(new Product { Currency="USD", Title = "Road-650 Red, 60", ProductNumber="BK-R50R-60", SubcategoryId=2, Description="Value-priced bike with many features of our top-of-the-line models. Has the same light, stiff frame, and the quick acceleration we're famous for.", ListPrice=782.9900, Weight=19.90, Color="Red", ImageUri = new Uri(ImageServerPath + "roadster_red_large.jpg")});
  96:             products.Add(new Product { Currency="USD", Title = "Road-650 Red, 62", ProductNumber="BK-R50R-62", SubcategoryId=2, Description="Value-priced bike with many features of our top-of-the-line models. Has the same light, stiff frame, and the quick acceleration we're famous for.", ListPrice=782.9900, Weight=20.00, Color="Red", ImageUri = new Uri(ImageServerPath + "roadster_red_large.jpg")});
  97:             products.Add(new Product { Currency="USD", Title = "Road-650 Red, 44", ProductNumber="BK-R50R-44", SubcategoryId=2, Description="Value-priced bike with many features of our top-of-the-line models. Has the same light, stiff frame, and the quick acceleration we're famous for.", ListPrice=782.9900, Weight=18.77, Color="Red", ImageUri = new Uri(ImageServerPath + "roadster_red_large.jpg")});
  98:             products.Add(new Product { Currency="USD", Title = "Road-650 Red, 48", ProductNumber="BK-R50R-48", SubcategoryId=2, Description="Value-priced bike with many features of our top-of-the-line models. Has the same light, stiff frame, and the quick acceleration we're famous for.", ListPrice=782.9900, Weight=19.13, Color="Red", ImageUri = new Uri(ImageServerPath + "roadster_red_large.jpg")});
  99:             products.Add(new Product { Currency="USD", Title = "Road-650 Red, 52", ProductNumber="BK-R50R-52", SubcategoryId=2, Description="Value-priced bike with many features of our top-of-the-line models. Has the same light, stiff frame, and the quick acceleration we're famous for.", ListPrice=782.9900, Weight=19.42, Color="Red", ImageUri = new Uri(ImageServerPath + "roadster_red_large.jpg")});
 100:             products.Add(new Product { Currency="USD", Title = "Road-650 Black, 58", ProductNumber="BK-R50B-58", SubcategoryId=2, Description="Value-priced bike with many features of our top-of-the-line models. Has the same light, stiff frame, and the quick acceleration we're famous for.", ListPrice=782.9900, Weight=19.79, Color="Black", ImageUri = new Uri(ImageServerPath + "roadster_black_large.jpg")});
 101:             products.Add(new Product { Currency="USD", Title = "Road-650 Black, 60", ProductNumber="BK-R50B-60", SubcategoryId=2, Description="Value-priced bike with many features of our top-of-the-line models. Has the same light, stiff frame, and the quick acceleration we're famous for.", ListPrice=782.9900, Weight=19.90, Color="Black", ImageUri = new Uri(ImageServerPath + "roadster_black_large.jpg")});
 102:             products.Add(new Product { Currency="USD", Title = "Road-650 Black, 62", ProductNumber="BK-R50B-62", SubcategoryId=2, Description="Value-priced bike with many features of our top-of-the-line models. Has the same light, stiff frame, and the quick acceleration we're famous for.", ListPrice=782.9900, Weight=20.00, Color="Black", ImageUri = new Uri(ImageServerPath + "roadster_black_large.jpg")});
 103:             products.Add(new Product { Currency="USD", Title = "Road-650 Black, 44", ProductNumber="BK-R50B-44", SubcategoryId=2, Description="Value-priced bike with many features of our top-of-the-line models. Has the same light, stiff frame, and the quick acceleration we're famous for.", ListPrice=782.9900, Weight=18.77, Color="Black", ImageUri = new Uri(ImageServerPath + "roadster_black_large.jpg")});
 104:             products.Add(new Product { Currency="USD", Title = "Road-650 Black, 48", ProductNumber="BK-R50B-48", SubcategoryId=2, Description="Value-priced bike with many features of our top-of-the-line models. Has the same light, stiff frame, and the quick acceleration we're famous for.", ListPrice=782.9900, Weight=19.13, Color="Black", ImageUri = new Uri(ImageServerPath + "roadster_black_large.jpg")});
 105:             products.Add(new Product { Currency="USD", Title = "Road-650 Black, 52", ProductNumber="BK-R50B-52", SubcategoryId=2, Description="Value-priced bike with many features of our top-of-the-line models. Has the same light, stiff frame, and the quick acceleration we're famous for.", ListPrice=782.9900, Weight=19.42, Color="Black", ImageUri = new Uri(ImageServerPath + "roadster_black_large.jpg")});
 106:             products.Add(new Product { Currency="USD", Title = "Road-550-W Yellow, 38", ProductNumber="BK-R64Y-38", SubcategoryId=2, Description="Same technology as all of our Road series bikes, but the frame is sized for a woman.  Perfect all-around bike for road or racing.", ListPrice=1120.4900, Weight=17.35, Color="Yellow", ImageUri = new Uri(ImageServerPath + "roadster_yellow_large.jpg")});
 107:             products.Add(new Product { Currency="USD", Title = "Road-550-W Yellow, 40", ProductNumber="BK-R64Y-40", SubcategoryId=2, Description="Same technology as all of our Road series bikes, but the frame is sized for a woman.  Perfect all-around bike for road or racing.", ListPrice=1120.4900, Weight=17.77, Color="Yellow", ImageUri = new Uri(ImageServerPath + "roadster_yellow_large.jpg")});
 108:             products.Add(new Product { Currency="USD", Title = "Road-550-W Yellow, 42", ProductNumber="BK-R64Y-42", SubcategoryId=2, Description="Same technology as all of our Road series bikes, but the frame is sized for a woman.  Perfect all-around bike for road or racing.", ListPrice=1120.4900, Weight=18.13, Color="Yellow", ImageUri = new Uri(ImageServerPath + "roadster_yellow_large.jpg")});
 109:             products.Add(new Product { Currency="USD", Title = "Road-550-W Yellow, 44", ProductNumber="BK-R64Y-44", SubcategoryId=2, Description="Same technology as all of our Road series bikes, but the frame is sized for a woman.  Perfect all-around bike for road or racing.", ListPrice=1120.4900, Weight=18.42, Color="Yellow", ImageUri = new Uri(ImageServerPath + "roadster_yellow_large.jpg")});
 110:             products.Add(new Product { Currency="USD", Title = "Road-550-W Yellow, 48", ProductNumber="BK-R64Y-48", SubcategoryId=2, Description="Same technology as all of our Road series bikes, but the frame is sized for a woman.  Perfect all-around bike for road or racing.", ListPrice=1120.4900, Weight=18.68, Color="Yellow", ImageUri = new Uri(ImageServerPath + "roadster_yellow_large.jpg")});
 111:             products.Add(new Product { Currency="USD", Title = "Road-450 Red, 58", ProductNumber="BK-R68R-58", SubcategoryId=2, Description="A true multi-sport bike that offers streamlined riding and a revolutionary design. Aerodynamic design lets you ride with the pros, and the gearing will conquer hilly roads.", ListPrice=1457.9900, Weight=17.79, Color="Red", ImageUri = new Uri(ImageServerPath + "roadster_red_large.jpg")});
 112:             products.Add(new Product { Currency="USD", Title = "Road-450 Red, 60", ProductNumber="BK-R68R-60", SubcategoryId=2, Description="A true multi-sport bike that offers streamlined riding and a revolutionary design. Aerodynamic design lets you ride with the pros, and the gearing will conquer hilly roads.", ListPrice=1457.9900, Weight=17.90, Color="Red", ImageUri = new Uri(ImageServerPath + "roadster_red_large.jpg")});
 113:             products.Add(new Product { Currency="USD", Title = "Road-450 Red, 44", ProductNumber="BK-R68R-44", SubcategoryId=2, Description="A true multi-sport bike that offers streamlined riding and a revolutionary design. Aerodynamic design lets you ride with the pros, and the gearing will conquer hilly roads.", ListPrice=1457.9900, Weight=16.77, Color="Red", ImageUri = new Uri(ImageServerPath + "roadster_red_large.jpg")});
 114:             products.Add(new Product { Currency="USD", Title = "Road-450 Red, 48", ProductNumber="BK-R68R-48", SubcategoryId=2, Description="A true multi-sport bike that offers streamlined riding and a revolutionary design. Aerodynamic design lets you ride with the pros, and the gearing will conquer hilly roads.", ListPrice=1457.9900, Weight=17.13, Color="Red", ImageUri = new Uri(ImageServerPath + "roadster_red_large.jpg")});
 115:             products.Add(new Product { Currency="USD", Title = "Road-450 Red, 52", ProductNumber="BK-R68R-52", SubcategoryId=2, Description="A true multi-sport bike that offers streamlined riding and a revolutionary design. Aerodynamic design lets you ride with the pros, and the gearing will conquer hilly roads.", ListPrice=1457.9900, Weight=17.42, Color="Red", ImageUri = new Uri(ImageServerPath + "roadster_red_large.jpg")});
 116:             products.Add(new Product { Currency="USD", Title = "Road-350-W Yellow, 40", ProductNumber="BK-R79Y-40", SubcategoryId=2, Description="Cross-train, race, or just socialize on a sleek, aerodynamic bike designed for a woman.  Advanced seat technology provides comfort all day.", ListPrice=1700.9900, Weight=15.35, Color="Yellow", ImageUri = new Uri(ImageServerPath + "roadster_yellow_large.jpg")});
 117:             products.Add(new Product { Currency="USD", Title = "Road-350-W Yellow, 42", ProductNumber="BK-R79Y-42", SubcategoryId=2, Description="Cross-train, race, or just socialize on a sleek, aerodynamic bike designed for a woman.  Advanced seat technology provides comfort all day.", ListPrice=1700.9900, Weight=15.77, Color="Yellow", ImageUri = new Uri(ImageServerPath + "roadster_yellow_large.jpg")});
 118:             products.Add(new Product { Currency="USD", Title = "Road-350-W Yellow, 44", ProductNumber="BK-R79Y-44", SubcategoryId=2, Description="Cross-train, race, or just socialize on a sleek, aerodynamic bike designed for a woman.  Advanced seat technology provides comfort all day.", ListPrice=1700.9900, Weight=16.13, Color="Yellow", ImageUri = new Uri(ImageServerPath + "roadster_yellow_large.jpg")});
 119:             products.Add(new Product { Currency="USD", Title = "Road-350-W Yellow, 48", ProductNumber="BK-R79Y-48", SubcategoryId=2, Description="Cross-train, race, or just socialize on a sleek, aerodynamic bike designed for a woman.  Advanced seat technology provides comfort all day.", ListPrice=1700.9900, Weight=16.42, Color="Yellow", ImageUri = new Uri(ImageServerPath + "roadster_yellow_large.jpg")});
 120:             products.Add(new Product { Currency="USD", Title = "Road-250 Red, 44", ProductNumber="BK-R89R-44", SubcategoryId=2, Description="Alluminum-alloy frame provides a light, stiff ride, whether you are racing in the velodrome or on a demanding club ride on country roads.", ListPrice=2443.3500, Weight=14.77, Color="Red", ImageUri = new Uri(ImageServerPath + "roadster_red_large.jpg")});
 121:             products.Add(new Product { Currency="USD", Title = "Road-250 Red, 48", ProductNumber="BK-R89R-48", SubcategoryId=2, Description="Alluminum-alloy frame provides a light, stiff ride, whether you are racing in the velodrome or on a demanding club ride on country roads.", ListPrice=2443.3500, Weight=15.13, Color="Red", ImageUri = new Uri(ImageServerPath + "roadster_red_large.jpg")});
 122:             products.Add(new Product { Currency="USD", Title = "Road-250 Red, 52", ProductNumber="BK-R89R-52", SubcategoryId=2, Description="Alluminum-alloy frame provides a light, stiff ride, whether you are racing in the velodrome or on a demanding club ride on country roads.", ListPrice=2443.3500, Weight=15.42, Color="Red", ImageUri = new Uri(ImageServerPath + "roadster_red_large.jpg")});
 123:             products.Add(new Product { Currency="USD", Title = "Road-250 Red, 58", ProductNumber="BK-R89R-58", SubcategoryId=2, Description="Alluminum-alloy frame provides a light, stiff ride, whether you are racing in the velodrome or on a demanding club ride on country roads.", ListPrice=2443.3500, Weight=15.79, Color="Red", ImageUri = new Uri(ImageServerPath + "roadster_red_large.jpg")});
 124:             products.Add(new Product { Currency="USD", Title = "Road-250 Black, 44", ProductNumber="BK-R89B-44", SubcategoryId=2, Description="Alluminum-alloy frame provides a light, stiff ride, whether you are racing in the velodrome or on a demanding club ride on country roads.", ListPrice=2443.3500, Weight=14.77, Color="Black", ImageUri = new Uri(ImageServerPath + "roadster_black_large.jpg")});
 125:             products.Add(new Product { Currency="USD", Title = "Road-250 Black, 48", ProductNumber="BK-R89B-48", SubcategoryId=2, Description="Alluminum-alloy frame provides a light, stiff ride, whether you are racing in the velodrome or on a demanding club ride on country roads.", ListPrice=2443.3500, Weight=15.13, Color="Black", ImageUri = new Uri(ImageServerPath + "roadster_black_large.jpg")});
 126:             products.Add(new Product { Currency="USD", Title = "Road-250 Black, 52", ProductNumber="BK-R89B-52", SubcategoryId=2, Description="Alluminum-alloy frame provides a light, stiff ride, whether you are racing in the velodrome or on a demanding club ride on country roads.", ListPrice=2443.3500, Weight=15.42, Color="Black", ImageUri = new Uri(ImageServerPath + "roadster_black_large.jpg")});
 127:             products.Add(new Product { Currency="USD", Title = "Road-250 Black, 58", ProductNumber="BK-R89B-58", SubcategoryId=2, Description="Alluminum-alloy frame provides a light, stiff ride, whether you are racing in the velodrome or on a demanding club ride on country roads.", ListPrice=2443.3500, Weight=15.68, Color="Black", ImageUri = new Uri(ImageServerPath + "roadster_black_large.jpg")});
 128:             products.Add(new Product { Currency="USD", Title = "Road-150 Red, 62", ProductNumber="BK-R93R-62", SubcategoryId=2, Description="This bike is ridden by race winners. Developed with the Adventure Works Cycles professional race team, it has a extremely light heat-treated aluminum frame, and steering that allows precision control.", ListPrice=3578.2700, Weight=15.00, Color="Red", ImageUri = new Uri(ImageServerPath + "roadster_red_large.jpg")});
 129:             products.Add(new Product { Currency="USD", Title = "Road-150 Red, 44", ProductNumber="BK-R93R-44", SubcategoryId=2, Description="This bike is ridden by race winners. Developed with the Adventure Works Cycles professional race team, it has a extremely light heat-treated aluminum frame, and steering that allows precision control.", ListPrice=3578.2700, Weight=13.77, Color="Red", ImageUri = new Uri(ImageServerPath + "roadster_red_large.jpg")});
 130:             products.Add(new Product { Currency="USD", Title = "Road-150 Red, 48", ProductNumber="BK-R93R-48", SubcategoryId=2, Description="This bike is ridden by race winners. Developed with the Adventure Works Cycles professional race team, it has a extremely light heat-treated aluminum frame, and steering that allows precision control.", ListPrice=3578.2700, Weight=14.13, Color="Red", ImageUri = new Uri(ImageServerPath + "roadster_red_large.jpg")});
 131:             products.Add(new Product { Currency="USD", Title = "Road-150 Red, 52", ProductNumber="BK-R93R-52", SubcategoryId=2, Description="This bike is ridden by race winners. Developed with the Adventure Works Cycles professional race team, it has a extremely light heat-treated aluminum frame, and steering that allows precision control.", ListPrice=3578.2700, Weight=14.42, Color="Red", ImageUri = new Uri(ImageServerPath + "roadster_red_large.jpg")});
 132:             products.Add(new Product { Currency="USD", Title = "Road-150 Red, 56", ProductNumber="BK-R93R-56", SubcategoryId=2, Description="This bike is ridden by race winners. Developed with the Adventure Works Cycles professional race team, it has a extremely light heat-treated aluminum frame, and steering that allows precision control.", ListPrice=3578.2700, Weight=14.68, Color="Red", ImageUri = new Uri(ImageServerPath + "roadster_red_large.jpg")});
 133:             products.Add(new Product { Currency="USD", Title = "Touring-3000 Blue, 54", ProductNumber="BK-T18U-54", SubcategoryId=3, Description="All-occasion value bike with our basic comfort and safety features. Offers wider, more stable tires for a ride around town or weekend trip.", ListPrice=742.3500, Weight=29.68, Color="Blue", ImageUri = new Uri(ImageServerPath + "julianax_r_02_blue_large.jpg")});
 134:             products.Add(new Product { Currency="USD", Title = "Touring-3000 Blue, 58", ProductNumber="BK-T18U-58", SubcategoryId=3, Description="All-occasion value bike with our basic comfort and safety features. Offers wider, more stable tires for a ride around town or weekend trip.", ListPrice=742.3500, Weight=29.90, Color="Blue", ImageUri = new Uri(ImageServerPath + "julianax_r_02_blue_large.jpg")});
 135:             products.Add(new Product { Currency="USD", Title = "Touring-3000 Blue, 62", ProductNumber="BK-T18U-62", SubcategoryId=3, Description="All-occasion value bike with our basic comfort and safety features. Offers wider, more stable tires for a ride around town or weekend trip.", ListPrice=742.3500, Weight=30.00, Color="Blue", ImageUri = new Uri(ImageServerPath + "julianax_r_02_blue_large.jpg")});
 136:             products.Add(new Product { Currency="USD", Title = "Touring-3000 Yellow, 44", ProductNumber="BK-T18Y-44", SubcategoryId=3, Description="All-occasion value bike with our basic comfort and safety features. Offers wider, more stable tires for a ride around town or weekend trip.", ListPrice=742.3500, Weight=28.77, Color="Yellow", ImageUri = new Uri(ImageServerPath + "julianax_r_02_yellow_large.jpg ")});
 137:             products.Add(new Product { Currency="USD", Title = "Touring-3000 Yellow, 50", ProductNumber="BK-T18Y-50", SubcategoryId=3, Description="All-occasion value bike with our basic comfort and safety features. Offers wider, more stable tires for a ride around town or weekend trip.", ListPrice=742.3500, Weight=29.13, Color="Yellow", ImageUri = new Uri(ImageServerPath + "julianax_r_02_yellow_large.jpg ")});
 138:             products.Add(new Product { Currency="USD", Title = "Touring-3000 Yellow, 54", ProductNumber="BK-T18Y-54", SubcategoryId=3, Description="All-occasion value bike with our basic comfort and safety features. Offers wider, more stable tires for a ride around town or weekend trip.", ListPrice=742.3500, Weight=29.42, Color="Yellow", ImageUri = new Uri(ImageServerPath + "julianax_r_02_yellow_large.jpg ")});
 139:             products.Add(new Product { Currency="USD", Title = "Touring-3000 Yellow, 58", ProductNumber="BK-T18Y-58", SubcategoryId=3, Description="All-occasion value bike with our basic comfort and safety features. Offers wider, more stable tires for a ride around town or weekend trip.", ListPrice=742.3500, Weight=29.79, Color="Yellow", ImageUri = new Uri(ImageServerPath + "julianax_r_02_yellow_large.jpg ")});
 140:             products.Add(new Product { Currency="USD", Title = "Touring-3000 Yellow, 62", ProductNumber="BK-T18Y-62", SubcategoryId=3, Description="All-occasion value bike with our basic comfort and safety features. Offers wider, more stable tires for a ride around town or weekend trip.", ListPrice=742.3500, Weight=30.00, Color="Yellow", ImageUri = new Uri(ImageServerPath + "julianax_r_02_yellow_large.jpg ")});
 141:             products.Add(new Product { Currency="USD", Title = "Touring-3000 Blue, 44", ProductNumber="BK-T18U-44", SubcategoryId=3, Description="All-occasion value bike with our basic comfort and safety features. Offers wider, more stable tires for a ride around town or weekend trip.", ListPrice=742.3500, Weight=28.77, Color="Blue", ImageUri = new Uri(ImageServerPath + "julianax_r_02_blue_large.jpg")});
 142:             products.Add(new Product { Currency="USD", Title = "Touring-3000 Blue, 50", ProductNumber="BK-T18U-50", SubcategoryId=3, Description="All-occasion value bike with our basic comfort and safety features. Offers wider, more stable tires for a ride around town or weekend trip.", ListPrice=742.3500, Weight=29.13, Color="Blue", ImageUri = new Uri(ImageServerPath + "julianax_r_02_blue_large.jpg")});
 143:             products.Add(new Product { Currency="USD", Title = "Touring-2000 Blue, 60", ProductNumber="BK-T44U-60", SubcategoryId=3, Description="The plush custom saddle keeps you riding all day,  and there's plenty of space to add panniers and bike bags to the newly-redesigned carrier.  This bike has stability when fully-loaded.", ListPrice=1214.8500, Weight=27.90, Color="Blue", ImageUri = new Uri(ImageServerPath + "julianax_r_02_blue_large.jpg")});
 144:             products.Add(new Product { Currency="USD", Title = "Touring-2000 Blue, 46", ProductNumber="BK-T44U-46", SubcategoryId=3, Description="The plush custom saddle keeps you riding all day,  and there's plenty of space to add panniers and bike bags to the newly-redesigned carrier.  This bike has stability when fully-loaded.", ListPrice=1214.8500, Weight=27.13, Color="Blue", ImageUri = new Uri(ImageServerPath + "julianax_r_02_blue_large.jpg")});
 145:             products.Add(new Product { Currency="USD", Title = "Touring-2000 Blue, 50", ProductNumber="BK-T44U-50", SubcategoryId=3, Description="The plush custom saddle keeps you riding all day,  and there's plenty of space to add panniers and bike bags to the newly-redesigned carrier.  This bike has stability when fully-loaded.", ListPrice=1214.8500, Weight=27.42, Color="Blue", ImageUri = new Uri(ImageServerPath + "julianax_r_02_blue_large.jpg")});
 146:             products.Add(new Product { Currency="USD", Title = "Touring-2000 Blue, 54", ProductNumber="BK-T44U-54", SubcategoryId=3, Description="The plush custom saddle keeps you riding all day,  and there's plenty of space to add panniers and bike bags to the newly-redesigned carrier.  This bike has stability when fully-loaded.", ListPrice=1214.8500, Weight=27.68, Color="Blue", ImageUri = new Uri(ImageServerPath + "julianax_r_02_blue_large.jpg")});
 147:             products.Add(new Product { Currency="USD", Title = "Touring-1000 Yellow, 46", ProductNumber="BK-T79Y-46", SubcategoryId=3, Description="Travel in style and comfort. Designed for maximum comfort and safety. Wide gear range takes on all hills. High-tech aluminum alloy construction provides durability without added weight.", ListPrice=2384.0700, Weight=25.13, Color="Yellow", ImageUri = new Uri(ImageServerPath + "julianax_r_02_yellow_large.jpg ")});
 148:             products.Add(new Product { Currency="USD", Title = "Touring-1000 Yellow, 50", ProductNumber="BK-T79Y-50", SubcategoryId=3, Description="Travel in style and comfort. Designed for maximum comfort and safety. Wide gear range takes on all hills. High-tech aluminum alloy construction provides durability without added weight.", ListPrice=2384.0700, Weight=25.42, Color="Yellow", ImageUri = new Uri(ImageServerPath + "julianax_r_02_yellow_large.jpg ")});
 149:             products.Add(new Product { Currency="USD", Title = "Touring-1000 Yellow, 54", ProductNumber="BK-T79Y-54", SubcategoryId=3, Description="Travel in style and comfort. Designed for maximum comfort and safety. Wide gear range takes on all hills. High-tech aluminum alloy construction provides durability without added weight.", ListPrice=2384.0700, Weight=25.68, Color="Yellow", ImageUri = new Uri(ImageServerPath + "julianax_r_02_yellow_large.jpg ")});
 150:             products.Add(new Product { Currency="USD", Title = "Touring-1000 Yellow, 60", ProductNumber="BK-T79Y-60", SubcategoryId=3, Description="Travel in style and comfort. Designed for maximum comfort and safety. Wide gear range takes on all hills. High-tech aluminum alloy construction provides durability without added weight.", ListPrice=2384.0700, Weight=25.90, Color="Yellow", ImageUri = new Uri(ImageServerPath + "julianax_r_02_yellow_large.jpg ")});
 151:             products.Add(new Product { Currency="USD", Title = "Touring-1000 Blue, 46", ProductNumber="BK-T79U-46", SubcategoryId=3, Description="Travel in style and comfort. Designed for maximum comfort and safety. Wide gear range takes on all hills. High-tech aluminum alloy construction provides durability without added weight.", ListPrice=2384.0700, Weight=25.13, Color="Blue", ImageUri = new Uri(ImageServerPath + "julianax_r_02_blue_large.jpg")});
 152:             products.Add(new Product { Currency="USD", Title = "Touring-1000 Blue, 50", ProductNumber="BK-T79U-50", SubcategoryId=3, Description="Travel in style and comfort. Designed for maximum comfort and safety. Wide gear range takes on all hills. High-tech aluminum alloy construction provides durability without added weight.", ListPrice=2384.0700, Weight=25.42, Color="Blue", ImageUri = new Uri(ImageServerPath + "julianax_r_02_blue_large.jpg")});
 153:             products.Add(new Product { Currency="USD", Title = "Touring-1000 Blue, 54", ProductNumber="BK-T79U-54", SubcategoryId=3, Description="Travel in style and comfort. Designed for maximum comfort and safety. Wide gear range takes on all hills. High-tech aluminum alloy construction provides durability without added weight.", ListPrice=2384.0700, Weight=25.68, Color="Blue", ImageUri = new Uri(ImageServerPath + "julianax_r_02_blue_large.jpg")});
 154:             products.Add(new Product { Currency="USD", Title = "Touring-1000 Blue, 60", ProductNumber="BK-T79U-60", SubcategoryId=3, Description="Travel in style and comfort. Designed for maximum comfort and safety. Wide gear range takes on all hills. High-tech aluminum alloy construction provides durability without added weight.", ListPrice=2384.0700, Weight=25.90, Color="Blue", ImageUri = new Uri(ImageServerPath + "julianax_r_02_blue_large.jpg")});
 155:             products.Add(new Product { Currency="USD", Title = "Chain", ProductNumber="CH-0234", SubcategoryId=7, Description="Superior shifting performance.", ListPrice=20.2400, Weight=0, Color="Silver", ImageUri = new Uri(ImageServerPath + "chain_large.jpg")});
 156:             products.Add(new Product { Currency="USD", Title = "LL Crankset", ProductNumber="CS-4759", SubcategoryId=8, Description="Super rigid spindle.", ListPrice=175.4900, Weight=600.00, Color="Black", ImageUri = new Uri(ImageServerPath + "crankset.jpg")});
 157:             products.Add(new Product { Currency = "USD", Title = "ML Crankset", ProductNumber = "CS-6583", SubcategoryId = 8, Description = "High-strength crank arm.", ListPrice = 256.4900, Weight = 635.00, Color = "Black", ImageUri = new Uri(ImageServerPath + "crankset.jpg") });
 158:             products.Add(new Product { Currency = "USD", Title = "HL Crankset", ProductNumber = "CS-9183", SubcategoryId = 8, Description = "Triple crankset; alumunim crank arm; flawless shifting.", ListPrice = 404.9900, Weight = 575.00, Color = "Black", ImageUri = new Uri(ImageServerPath + "crankset.jpg") });
 159:             products.Add(new Product { Currency="USD", Title = "Front Brakes", ProductNumber="FB-9873", SubcategoryId=6, Description="All-weather brake pads; provides superior stopping by applying more surface to the rim.", ListPrice=106.5000, Weight=317.00, Color="Silver", ImageUri = new Uri(ImageServerPath + "front_brakes.jpg")});
 160:             products.Add(new Product { Currency="USD", Title = "Front Derailleur", ProductNumber="FD-2342", SubcategoryId=9, Description="Wide-link design.", ListPrice=91.4900, Weight=88.00, Color="Silver", ImageUri = new Uri(ImageServerPath + "sprocket_front.jpg")});
 161:             products.Add(new Product { Currency="USD", Title = "LL Fork", ProductNumber="FK-1639", SubcategoryId=10, Description="Stout design absorbs shock and offers more precise steering.", ListPrice=148.2200, Weight=0, Color="saphire", ImageUri = new Uri(ImageServerPath + "fork_large.jpg")});
 162:             products.Add(new Product { Currency="USD", Title = "ML Fork", ProductNumber="FK-5136", SubcategoryId=10, Description="Composite road fork with an aluminum steerer tube.", ListPrice=175.4900, Weight=0, Color="saphire", ImageUri = new Uri(ImageServerPath + "fork_large.jpg")});
 163:             products.Add(new Product { Currency="USD", Title = "HL Fork", ProductNumber="FK-9939", SubcategoryId=10, Description="High-performance carbon road fork with curved legs.", ListPrice=229.4900, Weight=0, Color="saphire", ImageUri = new Uri(ImageServerPath + "fork_large.jpg")});
 164:             products.Add(new Product { Currency="USD", Title = "LL Mountain Frame - Red, 42", ProductNumber="FR-M21S-42", SubcategoryId=12, Description="Our best value utilizing the same, ground-breaking frame technology as the ML aluminum frame.", ListPrice=264.0500, Weight=2.92, Color="Silver", ImageUri = new Uri(ImageServerPath + "hotrod_frame_red_large.jpg")});
 165:             products.Add(new Product { Currency = "USD", Title = "LL Mountain Frame - Red, 44", ProductNumber = "FR-M21S-44", SubcategoryId = 12, Description = "Our best value utilizing the same, ground-breaking frame technology as the ML aluminum frame.", ListPrice = 264.0500, Weight = 2.96, Color = "Red", ImageUri = new Uri(ImageServerPath + "hotrod_frame_red_large.jpg") });
 166:             products.Add(new Product { Currency = "USD", Title = "LL Mountain Frame - Red, 48", ProductNumber = "FR-M21S-48", SubcategoryId = 12, Description = "Our best value utilizing the same, ground-breaking frame technology as the ML aluminum frame.", ListPrice = 264.0500, Weight = 3.00, Color = "Red", ImageUri = new Uri(ImageServerPath + "hotrod_frame_red_large.jpg") });
 167:             products.Add(new Product { Currency = "USD", Title = "LL Mountain Frame - Red, 52", ProductNumber = "FR-M21S-52", SubcategoryId = 12, Description = "Our best value utilizing the same, ground-breaking frame technology as the ML aluminum frame.", ListPrice = 264.0500, Weight = 3.04, Color = "Red", ImageUri = new Uri(ImageServerPath + "hotrod_frame_red_large.jpg") });
 168:             products.Add(new Product { Currency = "USD", Title = "LL Mountain Frame - Black, 42", ProductNumber = "FR-M21B-42", SubcategoryId = 12, Description = "Our best value utilizing the same, ground-breaking frame technology as the ML aluminum frame.", ListPrice = 249.7900, Weight = 2.92, Color = "Black", ImageUri = new Uri(ImageServerPath + "hotrod_frame_black_large.jpg") });
 169:             products.Add(new Product { Currency = "USD", Title = "LL Mountain Frame - Black, 44", ProductNumber = "FR-M21B-44", SubcategoryId = 12, Description = "Our best value utilizing the same, ground-breaking frame technology as the ML aluminum frame.", ListPrice = 249.7900, Weight = 2.96, Color = "Black", ImageUri = new Uri(ImageServerPath + "hotrod_frame_black_large.jpg") });
 170:             products.Add(new Product { Currency = "USD", Title = "LL Mountain Frame - Black, 48", ProductNumber = "FR-M21B-48", SubcategoryId = 12, Description = "Our best value utilizing the same, ground-breaking frame technology as the ML aluminum frame.", ListPrice = 249.7900, Weight = 3.00, Color = "Black", ImageUri = new Uri(ImageServerPath + "hotrod_frame_black_large.jpg") });
 171:             products.Add(new Product { Currency = "USD", Title = "LL Mountain Frame - Black, 52", ProductNumber = "FR-M21B-52", SubcategoryId = 12, Description = "Our best value utilizing the same, ground-breaking frame technology as the ML aluminum frame.", ListPrice = 249.7900, Weight = 3.04, Color = "Black", ImageUri = new Uri(ImageServerPath + "hotrod_frame_black_large.jpg") });
 172:             products.Add(new Product { Currency = "USD", Title = "LL Mountain Frame - Black, 40", ProductNumber = "FR-M21B-40", SubcategoryId = 12, Description = "Our best value utilizing the same, ground-breaking frame technology as the ML aluminum frame.", ListPrice = 249.7900, Weight = 2.88, Color = "Black", ImageUri = new Uri(ImageServerPath + "hotrod_frame_black_large.jpg") });
 173:             products.Add(new Product { Currency = "USD", Title = "LL Mountain Frame - Red, 40", ProductNumber = "FR-M21S-40", SubcategoryId = 12, Description = "Our best value utilizing the same, ground-breaking frame technology as the ML aluminum frame.", ListPrice = 264.0500, Weight = 2.88, Color = "Red", ImageUri = new Uri(ImageServerPath + "hotrod_frame_red_large.jpg") });
 174:             products.Add(new Product { Currency = "USD", Title = "ML Mountain Frame - Black, 38", ProductNumber = "FR-M63B-38", SubcategoryId = 12, Description = "The ML frame is a heat-treated aluminum frame made with the same detail and quality as our HL frame. It offers superior performance. Men's version.", ListPrice = 348.7600, Weight = 2.73, Color = "Black", ImageUri = new Uri(ImageServerPath + "hotrod_frame_black_large.jpg") });
 175:             products.Add(new Product { Currency = "USD", Title = "ML Mountain Frame-W - Red, 40", ProductNumber = "FR-M63S-40", SubcategoryId = 12, Description = "The ML frame is a heat-treated aluminum frame made with the same detail and quality as our HL frame. It offers superior performance. Men's version.", ListPrice = 364.0900, Weight = 2.77, Color = "Red", ImageUri = new Uri(ImageServerPath + "hotrod_frame_red_large.jpg") });
 176:             products.Add(new Product { Currency = "USD", Title = "ML Mountain Frame-W - Red, 42", ProductNumber = "FR-M63S-42", SubcategoryId = 12, Description = "The ML frame is a heat-treated aluminum frame made with the same detail and quality as our HL frame. It offers superior performance. Men's version.", ListPrice = 364.0900, Weight = 2.81, Color = "Red", ImageUri = new Uri(ImageServerPath + "hotrod_frame_red_large.jpg") });
 177:             products.Add(new Product { Currency = "USD", Title = "ML Mountain Frame-W - Red, 46", ProductNumber = "FR-M63S-46", SubcategoryId = 12, Description = "The ML frame is a heat-treated aluminum frame made with the same detail and quality as our HL frame. It offers superior performance. Men's version.", ListPrice = 364.0900, Weight = 2.85, Color = "Red", ImageUri = new Uri(ImageServerPath + "hotrod_frame_red_large.jpg") });
 178:             products.Add(new Product { Currency = "USD", Title = "ML Mountain Frame-W - Red, 38", ProductNumber = "FR-M63S-38", SubcategoryId = 12, Description = "The ML frame is a heat-treated aluminum frame made with the same detail and quality as our HL frame. It offers superior performance. Men's version.", ListPrice = 364.0900, Weight = 2.73, Color = "Red", ImageUri = new Uri(ImageServerPath + "hotrod_frame_red_large.jpg") });
 179:             products.Add(new Product { Currency = "USD", Title = "ML Mountain Frame - Black, 40", ProductNumber = "FR-M63B-40", SubcategoryId = 12, Description = "The ML frame is a heat-treated aluminum frame made with the same detail and quality as our HL frame. It offers superior performance. Women's version.", ListPrice = 348.7600, Weight = 2.77, Color = "Black", ImageUri = new Uri(ImageServerPath + "hotrod_frame_black_large.jpg") });
 180:             products.Add(new Product { Currency = "USD", Title = "ML Mountain Frame - Black, 44", ProductNumber = "FR-M63B-44", SubcategoryId = 12, Description = "The ML frame is a heat-treated aluminum frame made with the same detail and quality as our HL frame. It offers superior performance. Women's version.", ListPrice = 348.7600, Weight = 2.81, Color = "Black", ImageUri = new Uri(ImageServerPath + "hotrod_frame_black_large.jpg") });
 181:             products.Add(new Product { Currency = "USD", Title = "ML Mountain Frame - Black, 48", ProductNumber = "FR-M63B-48", SubcategoryId = 12, Description = "The ML frame is a heat-treated aluminum frame made with the same detail and quality as our HL frame. It offers superior performance. Women's version.", ListPrice = 348.7600, Weight = 2.85, Color = "Black", ImageUri = new Uri(ImageServerPath + "hotrod_frame_black_large.jpg") });
 182:             products.Add(new Product { Currency="USD", Title = "HL Mountain Frame - Red, 42", ProductNumber="FR-M94S-42", SubcategoryId=12, Description="Each frame is hand-crafted in our Bothell facility to the optimum diameter and wall-thickness required of a premium mountain frame. The heat-treated welded aluminum frame has a larger diameter tube that absorbs the bumps.", ListPrice=1364.5000, Weight=2.72, Color="Red", ImageUri = new Uri(ImageServerPath + "hotrod_frame_red_large.jpg")});
 183:             products.Add(new Product { Currency="USD", Title = "HL Mountain Frame - Red, 44", ProductNumber="FR-M94S-44", SubcategoryId=12, Description="Each frame is hand-crafted in our Bothell facility to the optimum diameter and wall-thickness required of a premium mountain frame. The heat-treated welded aluminum frame has a larger diameter tube that absorbs the bumps.", ListPrice=1364.5000, Weight=2.76, Color="Red", ImageUri = new Uri(ImageServerPath + "hotrod_frame_red_large.jpg")});
 184:             products.Add(new Product { Currency="USD", Title = "HL Mountain Frame - Red, 48", ProductNumber="FR-M94S-52", SubcategoryId=12, Description="Each frame is hand-crafted in our Bothell facility to the optimum diameter and wall-thickness required of a premium mountain frame. The heat-treated welded aluminum frame has a larger diameter tube that absorbs the bumps.", ListPrice=1364.5000, Weight=2.80, Color="Red", ImageUri = new Uri(ImageServerPath + "hotrod_frame_red_large.jpg")});
 185:             products.Add(new Product { Currency="USD", Title = "HL Mountain Frame - Red, 46", ProductNumber="FR-M94S-46", SubcategoryId=12, Description="Each frame is hand-crafted in our Bothell facility to the optimum diameter and wall-thickness required of a premium mountain frame. The heat-treated welded aluminum frame has a larger diameter tube that absorbs the bumps.", ListPrice=1364.5000, Weight=2.84, Color="Red", ImageUri = new Uri(ImageServerPath + "hotrod_frame_red_large.jpg")});
 186:             products.Add(new Product { Currency="USD", Title = "HL Mountain Frame - Black, 42", ProductNumber="FR-M94B-42", SubcategoryId=12, Description="Each frame is hand-crafted in our Bothell facility to the optimum diameter and wall-thickness required of a premium mountain frame. The heat-treated welded aluminum frame has a larger diameter tube that absorbs the bumps.", ListPrice=1349.6000, Weight=2.72, Color="Black", ImageUri = new Uri(ImageServerPath + "hotrod_frame_black_large.jpg")});
 187:             products.Add(new Product { Currency="USD", Title = "HL Mountain Frame - Black, 44", ProductNumber="FR-M94B-44", SubcategoryId=12, Description="Each frame is hand-crafted in our Bothell facility to the optimum diameter and wall-thickness required of a premium mountain frame. The heat-treated welded aluminum frame has a larger diameter tube that absorbs the bumps.", ListPrice=1349.6000, Weight=2.76, Color="Black", ImageUri = new Uri(ImageServerPath + "hotrod_frame_black_large.jpg")});
 188:             products.Add(new Product { Currency="USD", Title = "HL Mountain Frame - Black, 48", ProductNumber="FR-M94B-48", SubcategoryId=12, Description="Each frame is hand-crafted in our Bothell facility to the optimum diameter and wall-thickness required of a premium mountain frame. The heat-treated welded aluminum frame has a larger diameter tube that absorbs the bumps.", ListPrice=1349.6000, Weight=2.80, Color="Black", ImageUri = new Uri(ImageServerPath + "hotrod_frame_black_large.jpg")});
 189:             products.Add(new Product { Currency="USD", Title = "HL Mountain Frame - Black, 46", ProductNumber="FR-M94B-46", SubcategoryId=12, Description="Each frame is hand-crafted in our Bothell facility to the optimum diameter and wall-thickness required of a premium mountain frame. The heat-treated welded aluminum frame has a larger diameter tube that absorbs the bumps.", ListPrice=1349.6000, Weight=2.84, Color="Black", ImageUri = new Uri(ImageServerPath + "hotrod_frame_black_large.jpg")});
 190:             products.Add(new Product { Currency="USD", Title = "HL Mountain Frame - Black, 38", ProductNumber="FR-M94B-38", SubcategoryId=12, Description="Each frame is hand-crafted in our Bothell facility to the optimum diameter and wall-thickness required of a premium mountain frame. The heat-treated welded aluminum frame has a larger diameter tube that absorbs the bumps.", ListPrice=1349.6000, Weight=2.68, Color="Black", ImageUri = new Uri(ImageServerPath + "hotrod_frame_black_large.jpg")});
 191:             products.Add(new Product { Currency="USD", Title = "HL Mountain Frame - Red, 38", ProductNumber="FR-M94S-38", SubcategoryId=12, Description="Each frame is hand-crafted in our Bothell facility to the optimum diameter and wall-thickness required of a premium mountain frame. The heat-treated welded aluminum frame has a larger diameter tube that absorbs the bumps.", ListPrice=1364.5000, Weight=2.68, Color="Red", ImageUri = new Uri(ImageServerPath + "hotrod_frame_red_large.jpg")});
 192:             products.Add(new Product { Currency="USD", Title = "ML Road Frame-W - Yellow, 38", ProductNumber = "FR-R72Y-38", SubcategoryId = 14, Description = "Made from the same aluminum alloy as our top-of-the line HL frame, the ML features a lightweight down-tube milled to the perfect diameter for optimal strength. Women's version.", ListPrice = 594.8300, Weight = 2.18, Color = "Yellow", ImageUri = new Uri(ImageServerPath + "road_frame_yellow_large.jpg") });
 193:             products.Add(new Product { Currency="USD", Title = "ML Road Frame-W - Yellow, 40", ProductNumber="FR-R72Y-40", SubcategoryId=14, Description="Made from the same aluminum alloy as our top-of-the line HL frame, the ML features a lightweight down-tube milled to the perfect diameter for optimal strength. Women's version.", ListPrice=594.8300, Weight=2.22, Color="Yellow", ImageUri = new Uri(ImageServerPath + "road_frame_yellow_large.jpg")});
 194:             products.Add(new Product { Currency="USD", Title = "ML Road Frame-W - Yellow, 42", ProductNumber="FR-R72Y-42", SubcategoryId=14, Description="Made from the same aluminum alloy as our top-of-the line HL frame, the ML features a lightweight down-tube milled to the perfect diameter for optimal strength. Women's version.", ListPrice=594.8300, Weight=2.26, Color="Yellow", ImageUri = new Uri(ImageServerPath + "road_frame_yellow_large.jpg")});
 195:             products.Add(new Product { Currency="USD", Title = "ML Road Frame-W - Yellow, 44", ProductNumber="FR-R72Y-44", SubcategoryId=14, Description="Made from the same aluminum alloy as our top-of-the line HL frame, the ML features a lightweight down-tube milled to the perfect diameter for optimal strength. Women's version.", ListPrice=594.8300, Weight=2.30, Color="Yellow", ImageUri = new Uri(ImageServerPath + "road_frame_yellow_large.jpg")});
 196:             products.Add(new Product { Currency="USD", Title = "ML Road Frame-W - Yellow, 48", ProductNumber="FR-R72Y-48", SubcategoryId=14, Description="Made from the same aluminum alloy as our top-of-the line HL frame, the ML features a lightweight down-tube milled to the perfect diameter for optimal strength. Women's version.", ListPrice=594.8300, Weight=2.34, Color="Yellow", ImageUri = new Uri(ImageServerPath + "road_frame_yellow_large.jpg")});
 197:             products.Add(new Product { Currency="USD", Title = "LL Mountain Front Wheel", ProductNumber="FW-M423", SubcategoryId=17, Description="Replacement mountain wheel for entry-level rider.", ListPrice=60.7450, Weight=0, Color="Black", ImageUri = new Uri(ImageServerPath + "wheel_large.jpg")});
 198:             products.Add(new Product { Currency="USD", Title = "ML Mountain Front Wheel", ProductNumber="FW-M762", SubcategoryId=17, Description="Replacement mountain wheel for the casual to serious rider.", ListPrice=209.0250, Weight=0, Color="Black", ImageUri = new Uri(ImageServerPath + "wheel_large.jpg")});
 199:             products.Add(new Product { Currency="USD", Title = "HL Mountain Front Wheel", ProductNumber="FW-M928", SubcategoryId=17, Description="High-performance mountain replacement wheel.", ListPrice=300.2150, Weight=0, Color="Black", ImageUri = new Uri(ImageServerPath + "wheel_large.jpg")});
 200:             products.Add(new Product { Currency="USD", Title = "LL Road Front Wheel", ProductNumber="FW-R623", SubcategoryId=17, Description="Replacement road front wheel for entry-level cyclist.", ListPrice=85.5650, Weight=900.00, Color="Black", ImageUri = new Uri(ImageServerPath + "wheel_large.jpg")});
 201:             products.Add(new Product { Currency="USD", Title = "ML Road Front Wheel", ProductNumber="FW-R762", SubcategoryId=17, Description="Sturdy alloy features a quick-release hub.", ListPrice=248.3850, Weight=850.00, Color="Black", ImageUri = new Uri(ImageServerPath + "wheel_large.jpg")});
 202:             products.Add(new Product { Currency="USD", Title = "HL Road Front Wheel", ProductNumber="FW-R820", SubcategoryId=17, Description="Strong wheel with double-walled rim.", ListPrice=330.0600, Weight=650.00, Color="Black", ImageUri = new Uri(ImageServerPath + "wheel_large.jpg")});
 203:             products.Add(new Product { Currency="USD", Title = "Touring Front Wheel", ProductNumber="FW-T905", SubcategoryId=17, Description="Aerodynamic rims for smooth riding.", ListPrice=218.0100, Weight=0, Color="Black", ImageUri = new Uri(ImageServerPath + "wheel_large.jpg")});
 204:             products.Add(new Product { Currency="USD", Title = "LL Mountain Handlebars", ProductNumber="HB-M243", SubcategoryId=4, Description="All-purpose bar for on or off-road.", ListPrice=44.5400, Weight=0, Color="saphire", ImageUri = new Uri(ImageServerPath + "handlebar_large.jpg")});
 205:             products.Add(new Product { Currency="USD", Title = "ML Mountain Handlebars", ProductNumber="HB-M763", SubcategoryId=4, Description="Tough aluminum alloy bars for downhill.", ListPrice=61.9200, Weight=0, Color="saphire", ImageUri = new Uri(ImageServerPath + "handlebar_large.jpg")});
 206:             products.Add(new Product { Currency="USD", Title = "HL Mountain Handlebars", ProductNumber="HB-M918", SubcategoryId=4, Description="Flat bar strong enough for the pro circuit.", ListPrice=120.2700, Weight=0, Color="saphire", ImageUri = new Uri(ImageServerPath + "handlebar_large.jpg")});
 207:             products.Add(new Product { Currency = "USD", Title = "LL Road Handlebars", ProductNumber = "HB-R504", SubcategoryId = 4, Description = "Unique shape provides easier reach to the levers.", ListPrice = 44.5400, Weight = 0, Color = "saphire", ImageUri = new Uri(ImageServerPath + "road_handlebar_large.jpg") });
 208:             products.Add(new Product { Currency = "USD", Title = "ML Road Handlebars", ProductNumber = "HB-R720", SubcategoryId = 4, Description = "Anatomically shaped aluminum tube bar will suit all riders.", ListPrice = 61.9200, Weight = 0, Color = "saphire", ImageUri = new Uri(ImageServerPath + "road_handlebar_large.jpg") });
 209:             products.Add(new Product { Currency="USD", Title = "HL Road Handlebars", ProductNumber="HB-R956", SubcategoryId=4, Description="Designed for racers; high-end anatomically shaped bar from aluminum alloy.", ListPrice=120.2700, Weight=0, Color="saphire", ImageUri = new Uri(ImageServerPath + "road_handlebar_large.jpg")});
 210:             products.Add(new Product { Currency="USD", Title = "LL Touring Handlebars", ProductNumber="HB-T721", SubcategoryId=4, Description="Unique shape reduces fatigue for entry level riders.", ListPrice=46.0900, Weight=0, Color="saphire", ImageUri = new Uri(ImageServerPath + "touring_handlebar_large.jpg")});
 211:             products.Add(new Product { Currency="USD", Title = "HL Touring Handlebars", ProductNumber="HB-T928", SubcategoryId=4, Description="A light yet stiff aluminum bar for long distance riding.", ListPrice=91.5700, Weight=0, Color="saphire", ImageUri = new Uri(ImageServerPath + "touring_handlebar_large.jpg")});
 212:             products.Add(new Product { Currency="USD", Title = "LL Headset", ProductNumber="HS-0296", SubcategoryId=11, Description="Threadless headset provides quality at an economical price.", ListPrice=34.2000, Weight=0, Color="saphire", ImageUri = new Uri(ImageServerPath + "headset.jpg")});
 213:             products.Add(new Product { Currency = "USD", Title = "ML Headset", ProductNumber = "HS-2451", SubcategoryId = 11, Description = "Sealed cartridge keeps dirt out.", ListPrice = 102.2900, Weight = 0, Color = "saphire", ImageUri = new Uri(ImageServerPath + "headset.jpg") });
 214:             products.Add(new Product { Currency="USD", Title = "HL Headset", ProductNumber="HS-3479", SubcategoryId=11, Description="High-quality 1\" threadless headset with a grease port for quick lubrication.", ListPrice=124.7300, Weight=0, Color="saphire", ImageUri = new Uri(ImageServerPath + "headset.jpg")});
 215:             products.Add(new Product { Currency="USD", Title = "LL Mountain Pedal", ProductNumber="PD-M282", SubcategoryId=13, Description="Expanded platform so you can ride in any shoes; great for all-around riding.", ListPrice=40.4900, Weight=218.00, Color="Silver/Black", ImageUri = new Uri(ImageServerPath + "pedal_large.jpg")});
 216:             products.Add(new Product { Currency="USD", Title = "ML Mountain Pedal", ProductNumber="PD-M340", SubcategoryId=13, Description="Lightweight, durable, clipless pedal with adjustable tension.", ListPrice=62.0900, Weight=215.00, Color="Silver/Black", ImageUri = new Uri(ImageServerPath + "pedal_large.jpg")});
 217:             products.Add(new Product { Currency="USD", Title = "HL Mountain Pedal", ProductNumber="PD-M562", SubcategoryId=13, Description="Stainless steel; designed to shed mud easily.", ListPrice=80.9900, Weight=185.00, Color="Silver/Black", ImageUri = new Uri(ImageServerPath + "pedal_large.jpg")});
 218:             products.Add(new Product { Currency="USD", Title = "LL Road Pedal", ProductNumber="PD-R347", SubcategoryId=13, Description="Clipless pedals - aluminum.", ListPrice=40.4900, Weight=189.00, Color="Silver/Black", ImageUri = new Uri(ImageServerPath + "clipless_pedals_large.jpg")});
 219:             products.Add(new Product { Currency="USD", Title = "ML Road Pedal", ProductNumber="PD-R563", SubcategoryId=13, Description="Lightweight aluminum alloy construction.", ListPrice=62.0900, Weight=168.00, Color="Silver/Black", ImageUri = new Uri(ImageServerPath + "clipless_pedals_large.jpg")});
 220:             products.Add(new Product { Currency="USD", Title = "HL Road Pedal", ProductNumber="PD-R853", SubcategoryId=13, Description="Top-of-the-line clipless pedals with adjustable tension.", ListPrice=80.9900, Weight=149.00, Color="Silver/Black", ImageUri = new Uri(ImageServerPath + "clipless_pedals_large.jpg")});
 221:             products.Add(new Product { Currency="USD", Title = "Touring Pedal", ProductNumber="PD-T852", SubcategoryId=13, Description="A stable pedal for all-day riding.", ListPrice=80.9900, Weight=0, Color="Silver/Black", ImageUri = new Uri(ImageServerPath + "clipless_pedals_large.jpg")});
 222:             products.Add(new Product { Currency="USD", Title = "ML Road Rear Wheel", ProductNumber="RW-R762", SubcategoryId=17, Description="Aluminum alloy rim with stainless steel spokes; built for speed.", ListPrice=275.3850, Weight=1000.00, Color="Black", ImageUri = new Uri(ImageServerPath + "wheel_large.jpg")});
 223:             products.Add(new Product { Currency="USD", Title = "HL Road Rear Wheel", ProductNumber="RW-R820", SubcategoryId=17, Description="Strong rear wheel with double-walled rim.", ListPrice=357.0600, Weight=890.00, Color="Black", ImageUri = new Uri(ImageServerPath + "wheel_large.jpg")});
 224:             products.Add(new Product { Currency="USD", Title = "Touring Rear Wheel", ProductNumber="RW-T905", SubcategoryId=17, Description="Excellent aerodynamic rims guarantee a smooth ride.", ListPrice=245.0100, Weight=0, Color="Black", ImageUri = new Uri(ImageServerPath + "wheel_large.jpg")});
 225:             products.Add(new Product { Currency="USD", Title = "LL Mountain Seat/Saddle", ProductNumber="SE-M236", SubcategoryId=15, Description="Synthetic leather. Features gel for increased comfort.", ListPrice=27.1200, Weight=0, Color="saphire", ImageUri = new Uri(ImageServerPath + "mtn_seat.jpg")});
 226:             products.Add(new Product { Currency="USD", Title = "ML Mountain Seat/Saddle", ProductNumber="SE-M798", SubcategoryId=15, Description="Designed to absorb shock.", ListPrice=39.1400, Weight=0, Color="saphire", ImageUri = new Uri(ImageServerPath + "mtn_seat.jpg")});
 227:             products.Add(new Product { Currency="USD", Title = "HL Mountain Seat/Saddle", ProductNumber="SE-M940", SubcategoryId=15, Description="Anatomic design for a full-day of riding in comfort. Durable leather.", ListPrice=52.6400, Weight=0, Color="saphire", ImageUri = new Uri(ImageServerPath + "mtn_seat.jpg")});
 228:             products.Add(new Product { Currency="USD", Title = "LL Road Seat/Saddle", ProductNumber="SE-R581", SubcategoryId=15, Description="Lightweight foam-padded saddle.", ListPrice=27.1200, Weight=0, Color="saphire", ImageUri = new Uri(ImageServerPath + "road_seat.jpg")});
 229:             products.Add(new Product { Currency = "USD", Title = "ML Road Seat/Saddle", ProductNumber = "SE-R908", SubcategoryId = 15, Description = "Rubber bumpers absorb bumps.", ListPrice = 39.1400, Weight = 0, Color = "saphire", ImageUri = new Uri(ImageServerPath + "road_seat.jpg") });
 230:             products.Add(new Product { Currency="USD", Title = "HL Road Seat/Saddle", ProductNumber="SE-R995", SubcategoryId=15, Description="Lightweight kevlar racing saddle. Leather.", ListPrice=52.6400, Weight=0, Color="saphire", ImageUri = new Uri(ImageServerPath + "road_seat.jpg")});
 231:             products.Add(new Product { Currency="USD", Title = "LL Touring Seat/Saddle", ProductNumber="SE-T312", SubcategoryId=15, Description="Comfortable, ergonomically shaped gel saddle.", ListPrice=27.1200, Weight=0, Color="saphire", ImageUri = new Uri(ImageServerPath + "touring_seat.jpg")});
 232:             products.Add(new Product { Currency="USD", Title = "ML Touring Seat/Saddle", ProductNumber="SE-T762", SubcategoryId=15, Description="New design relieves pressure for long rides.", ListPrice=39.1400, Weight=0, Color="saphire", ImageUri = new Uri(ImageServerPath + "touring_seat.jpg")});
 233:             products.Add(new Product { Currency="USD", Title = "HL Touring Seat/Saddle", ProductNumber="SE-T924", SubcategoryId=15, Description="Cut-out shell for a more comfortable ride.", ListPrice=52.6400, Weight=0, Color="saphire", ImageUri = new Uri(ImageServerPath + "touring_seat.jpg")});
 234:             products.Add(new Product { Currency="USD", Title = "LL Mountain Tire", ProductNumber="TI-M267", SubcategoryId=37, Description="Comparible traction, less expensive wire bead casing.", ListPrice=24.9900, Weight=0, Color="saphire", ImageUri = new Uri(ImageServerPath + "mb_tires_large.jpg")});
 235:             products.Add(new Product { Currency="USD", Title = "ML Mountain Tire", ProductNumber="TI-M602", SubcategoryId=37, Description="Great traction, high-density rubber.", ListPrice=29.9900, Weight=0, Color="saphire", ImageUri = new Uri(ImageServerPath + "mb_tires_large.jpg")});
 236:             products.Add(new Product { Currency="USD", Title = "HL Mountain Tire", ProductNumber="TI-M823", SubcategoryId=37, Description="Incredible traction, lightweight carbon reinforced.", ListPrice=35.0000, Weight=0, Color="saphire", ImageUri = new Uri(ImageServerPath + "mb_tires_large.jpg")});
 237:             products.Add(new Product { Currency="USD", Title = "LL Road Tire", ProductNumber="TI-R092", SubcategoryId=37, Description="Same great treads as more expensive tire with a less expensive wire bead casing.", ListPrice=21.4900, Weight=0, Color="saphire", ImageUri = new Uri(ImageServerPath + "street_tires_large.jpg")});
 238:             products.Add(new Product { Currency="USD", Title = "ML Road Tire", ProductNumber="TI-R628", SubcategoryId=37, Description="Higher density rubber.", ListPrice=24.9900, Weight=0, Color="saphire", ImageUri = new Uri(ImageServerPath + "street_tires_large.jpg")});
 239:             products.Add(new Product { Currency="USD", Title = "HL Road Tire", ProductNumber="TI-R982", SubcategoryId=37, Description="Lightweight carbon reinforced  for an unrivaled ride at an un-compromised weight.", ListPrice=32.6000, Weight=0, Color="saphire", ImageUri = new Uri(ImageServerPath + "street_tires_large.jpg")});
 240:             products.Add(new Product { Currency = "USD", Title = "Touring Tire", ProductNumber = "TI-T723", SubcategoryId = 37, Description = "High-density rubber.", ListPrice = 28.9900, Weight = 0, Color = "saphire", ImageUri = new Uri(ImageServerPath + "touring_tires_large.jpg") });
 241:             products.Add(new Product { Currency="USD", Title = "Mountain Tire Tube", ProductNumber="TT-M928", SubcategoryId=37, Description="Self-sealing tube.", ListPrice=4.9900, Weight=0, Color="saphire", ImageUri = new Uri(ImageServerPath + "mtn_innertube_large.jpg")});
 242:             products.Add(new Product { Currency = "USD", Title = "Road Tire Tube", ProductNumber = "TT-R982", SubcategoryId = 37, Description = "Conventional all-purpose tube.", ListPrice = 3.9900, Weight = 0, Color = "saphire", ImageUri = new Uri(ImageServerPath + "road_innertube_large.jpg") });
 243:             products.Add(new Product { Currency="USD", Title = "Touring Tire Tube", ProductNumber="TT-T092", SubcategoryId=37, Description="General purpose tube.", ListPrice=4.9900, Weight=0, Color="saphire", ImageUri = new Uri(ImageServerPath + "innertube_large.jpg")});
 244:             products.Add(new Product { Currency="USD", Title = "LL Road Frame - Black, 58", ProductNumber="FR-R38B-58", SubcategoryId=14, Description="The LL Frame provides a safe comfortable ride, while offering superior bump absorption in a value-priced aluminum frame.", ListPrice=337.2200, Weight=2.46, Color="Black", ImageUri = new Uri(ImageServerPath + "road_frame_black_large.jpg")});
 245:             products.Add(new Product { Currency="USD", Title = "LL Road Frame - Black, 60", ProductNumber="FR-R38B-60", SubcategoryId=14, Description="The LL Frame provides a safe comfortable ride, while offering superior bump absorption in a value-priced aluminum frame.", ListPrice=337.2200, Weight=2.48, Color="Black", ImageUri = new Uri(ImageServerPath + "road_frame_black_large.jpg")});
 246:             products.Add(new Product { Currency="USD", Title = "LL Road Frame - Black, 62", ProductNumber="FR-R38B-62", SubcategoryId=14, Description="The LL Frame provides a safe comfortable ride, while offering superior bump absorption in a value-priced aluminum frame.", ListPrice=337.2200, Weight=2.50, Color="Black", ImageUri = new Uri(ImageServerPath + "road_frame_black_large.jpg")});
 247:             products.Add(new Product { Currency="USD", Title = "LL Road Frame - Red, 44", ProductNumber="FR-R38R-44", SubcategoryId=14, Description="The LL Frame provides a safe comfortable ride, while offering superior bump absorption in a value-priced aluminum frame.", ListPrice=337.2200, Weight=2.32, Color="Red", ImageUri = new Uri(ImageServerPath + "road_frame_red_large.jpg")});
 248:             products.Add(new Product { Currency="USD", Title = "LL Road Frame - Red, 48", ProductNumber="FR-R38R-48", SubcategoryId=14, Description="The LL Frame provides a safe comfortable ride, while offering superior bump absorption in a value-priced aluminum frame.", ListPrice=337.2200, Weight=2.36, Color="Red", ImageUri = new Uri(ImageServerPath + "road_frame_red_large.jpg")});
 249:             products.Add(new Product { Currency="USD", Title = "LL Road Frame - Red, 52", ProductNumber="FR-R38R-52", SubcategoryId=14, Description="The LL Frame provides a safe comfortable ride, while offering superior bump absorption in a value-priced aluminum frame.", ListPrice=337.2200, Weight=2.40, Color="Red", ImageUri = new Uri(ImageServerPath + "road_frame_red_large.jpg")});
 250:             products.Add(new Product { Currency="USD", Title = "LL Road Frame - Red, 58", ProductNumber="FR-R38R-58", SubcategoryId=14, Description="The LL Frame provides a safe comfortable ride, while offering superior bump absorption in a value-priced aluminum frame.", ListPrice=337.2200, Weight=2.46, Color="Red", ImageUri = new Uri(ImageServerPath + "road_frame_red_large.jpg")});
 251:             products.Add(new Product { Currency="USD", Title = "LL Road Frame - Red, 60", ProductNumber="FR-R38R-60", SubcategoryId=14, Description="The LL Frame provides a safe comfortable ride, while offering superior bump absorption in a value-priced aluminum frame.", ListPrice=337.2200, Weight=2.48, Color="Red", ImageUri = new Uri(ImageServerPath + "road_frame_red_large.jpg")});
 252:             products.Add(new Product { Currency="USD", Title = "LL Road Frame - Red, 62", ProductNumber="FR-R38R-62", SubcategoryId=14, Description="The LL Frame provides a safe comfortable ride, while offering superior bump absorption in a value-priced aluminum frame.", ListPrice=337.2200, Weight=2.50, Color="Red", ImageUri = new Uri(ImageServerPath + "road_frame_red_large.jpg")});            
 253:             products.Add(new Product { Currency="USD", Title = "LL Road Frame - Black, 44", ProductNumber="FR-R38B-44", SubcategoryId=14, Description="The LL Frame provides a safe comfortable ride, while offering superior bump absorption in a value-priced aluminum frame.", ListPrice=337.2200, Weight=2.32, Color="Black", ImageUri = new Uri(ImageServerPath + "road_frame_black_large.jpg")});
 254:             products.Add(new Product { Currency="USD", Title = "LL Road Frame - Black, 48", ProductNumber="FR-R38B-48", SubcategoryId=14, Description="The LL Frame provides a safe comfortable ride, while offering superior bump absorption in a value-priced aluminum frame.", ListPrice=337.2200, Weight=2.36, Color="Black", ImageUri = new Uri(ImageServerPath + "road_frame_black_large.jpg")});
 255:             products.Add(new Product { Currency="USD", Title = "LL Road Frame - Black, 52", ProductNumber="FR-R38B-52", SubcategoryId=14, Description="The LL Frame provides a safe comfortable ride, while offering superior bump absorption in a value-priced aluminum frame.", ListPrice=337.2200, Weight=2.40, Color="Black", ImageUri = new Uri(ImageServerPath + "road_frame_black_large.jpg")});            
 256:             products.Add(new Product { Currency="USD", Title = "ML Road Frame - Red, 44", ProductNumber="FR-R72R-44", SubcategoryId=14, Description="Made from the same aluminum alloy as our top-of-the line HL frame, the ML features a lightweight down-tube milled to the perfect diameter for optimal strength. Men's version.", ListPrice=594.8300, Weight=2.22, Color="Red", ImageUri = new Uri(ImageServerPath + "road_frame_red_large.jpg")});
 257:             products.Add(new Product { Currency="USD", Title = "ML Road Frame - Red, 48", ProductNumber="FR-R72R-48", SubcategoryId=14, Description="Made from the same aluminum alloy as our top-of-the line HL frame, the ML features a lightweight down-tube milled to the perfect diameter for optimal strength. Men's version.", ListPrice=594.8300, Weight=2.26, Color="Red", ImageUri = new Uri(ImageServerPath + "road_frame_red_large.jpg")});
 258:             products.Add(new Product { Currency="USD", Title = "ML Road Frame - Red, 52", ProductNumber="FR-R72R-52", SubcategoryId=14, Description="Made from the same aluminum alloy as our top-of-the line HL frame, the ML features a lightweight down-tube milled to the perfect diameter for optimal strength. Men's version.", ListPrice=594.8300, Weight=2.30, Color="Red", ImageUri = new Uri(ImageServerPath + "road_frame_red_large.jpg")});
 259:             products.Add(new Product { Currency="USD", Title = "ML Road Frame - Red, 58", ProductNumber="FR-R72R-58", SubcategoryId=14, Description="Made from the same aluminum alloy as our top-of-the line HL frame, the ML features a lightweight down-tube milled to the perfect diameter for optimal strength. Men's version.", ListPrice=594.8300, Weight=2.36, Color="Red", ImageUri = new Uri(ImageServerPath + "road_frame_red_large.jpg")});
 260:             products.Add(new Product { Currency="USD", Title = "ML Road Frame - Red, 60", ProductNumber="FR-R72R-60", SubcategoryId=14, Description="Made from the same aluminum alloy as our top-of-the line HL frame, the ML features a lightweight down-tube milled to the perfect diameter for optimal strength. Men's version.", ListPrice=594.8300, Weight=2.38, Color="Red", ImageUri = new Uri(ImageServerPath + "road_frame_red_large.jpg")});            
 261:             products.Add(new Product { Currency="USD", Title = "HL Road Frame - Black, 58", ProductNumber="FR-R92B-58", SubcategoryId=14, Description="Our lightest and best quality aluminum frame made from the newest alloy; it is welded and heat-treated for strength. Our innovative design results in maximum comfort and performance.", ListPrice=1431.5000, Weight=2.24, Color="Black", ImageUri = new Uri(ImageServerPath + "road_frame_black_large.jpg")});            
 262:             products.Add(new Product { Currency="USD", Title = "HL Road Frame - Red, 58", ProductNumber="FR-R92R-58", SubcategoryId=14, Description="Our lightest and best quality aluminum frame made from the newest alloy; it is welded and heat-treated for strength. Our innovative design results in maximum comfort and performance.", ListPrice=1431.5000, Weight=2.24, Color="Red", ImageUri = new Uri(ImageServerPath + "road_frame_red_large.jpg")});
 263:             products.Add(new Product { Currency="USD", Title = "HL Road Frame - Red, 62", ProductNumber="FR-R92R-62", SubcategoryId=14, Description="Our lightest and best quality aluminum frame made from the newest alloy; it is welded and heat-treated for strength. Our innovative design results in maximum comfort and performance.", ListPrice=1431.5000, Weight=2.30, Color="Red", ImageUri = new Uri(ImageServerPath + "road_frame_red_large.jpg")});
 264:             products.Add(new Product { Currency="USD", Title = "HL Road Frame - Red, 44", ProductNumber="FR-R92R-44", SubcategoryId=14, Description="Our lightest and best quality aluminum frame made from the newest alloy; it is welded and heat-treated for strength. Our innovative design results in maximum comfort and performance.", ListPrice=1431.5000, Weight=2.12, Color="Red", ImageUri = new Uri(ImageServerPath + "road_frame_red_large.jpg")});
 265:             products.Add(new Product { Currency="USD", Title = "HL Road Frame - Red, 48", ProductNumber="FR-R92R-48", SubcategoryId=14, Description="Our lightest and best quality aluminum frame made from the newest alloy; it is welded and heat-treated for strength. Our innovative design results in maximum comfort and performance.", ListPrice=1431.5000, Weight=2.16, Color="Red", ImageUri = new Uri(ImageServerPath + "road_frame_red_large.jpg")});
 266:             products.Add(new Product { Currency="USD", Title = "HL Road Frame - Red, 52", ProductNumber="FR-R92R-52", SubcategoryId=14, Description="Our lightest and best quality aluminum frame made from the newest alloy; it is welded and heat-treated for strength. Our innovative design results in maximum comfort and performance.", ListPrice=1431.5000, Weight=2.20, Color="Red", ImageUri = new Uri(ImageServerPath + "road_frame_red_large.jpg")});
 267:             products.Add(new Product { Currency="USD", Title = "HL Road Frame - Red, 56", ProductNumber="FR-R92R-56", SubcategoryId=14, Description="Our lightest and best quality aluminum frame made from the newest alloy; it is welded and heat-treated for strength. Our innovative design results in maximum comfort and performance.", ListPrice=1431.5000, Weight=2.24, Color="Red", ImageUri = new Uri(ImageServerPath + "road_frame_red_large.jpg")});            
 268:             products.Add(new Product { Currency="USD", Title = "HL Road Frame - Black, 62", ProductNumber="FR-R92B-62", SubcategoryId=14, Description="Our lightest and best quality aluminum frame made from the newest alloy; it is welded and heat-treated for strength. Our innovative design results in maximum comfort and performance.", ListPrice=1431.5000, Weight=2.30, Color="Black", ImageUri = new Uri(ImageServerPath + "road_frame_black_large.jpg")});
 269:             products.Add(new Product { Currency="USD", Title = "HL Road Frame - Black, 44", ProductNumber="FR-R92B-44", SubcategoryId=14, Description="Our lightest and best quality aluminum frame made from the newest alloy; it is welded and heat-treated for strength. Our innovative design results in maximum comfort and performance.", ListPrice=1431.5000, Weight=2.12, Color="Black", ImageUri = new Uri(ImageServerPath + "road_frame_black_large.jpg")});
 270:             products.Add(new Product { Currency="USD", Title = "HL Road Frame - Black, 48", ProductNumber="FR-R92B-48", SubcategoryId=14, Description="Our lightest and best quality aluminum frame made from the newest alloy; it is welded and heat-treated for strength. Our innovative design results in maximum comfort and performance.", ListPrice=1431.5000, Weight=2.16, Color="Black", ImageUri = new Uri(ImageServerPath + "road_frame_black_large.jpg")});
 271:             products.Add(new Product { Currency="USD", Title = "HL Road Frame - Black, 52", ProductNumber="FR-R92B-52", SubcategoryId=14, Description="Our lightest and best quality aluminum frame made from the newest alloy; it is welded and heat-treated for strength. Our innovative design results in maximum comfort and performance.", ListPrice=1431.5000, Weight=2.20, Color="Black", ImageUri = new Uri(ImageServerPath + "road_frame_black_large.jpg")});
 272:             products.Add(new Product { Currency="USD", Title = "LL Touring Frame - Yellow, 62", ProductNumber="FR-T67Y-62", SubcategoryId=16, Description="Lightweight butted aluminum frame provides a more upright riding position for a trip around town.  Our ground-breaking design provides optimum comfort.", ListPrice=333.4200, Weight=3.20, Color="Yellow", ImageUri = new Uri(ImageServerPath + "touring_frame_yellow_large.jpg")});            
 273:             products.Add(new Product { Currency="USD", Title = "LL Touring Frame - Blue, 50", ProductNumber="FR-T67U-50", SubcategoryId=16, Description="Lightweight butted aluminum frame provides a more upright riding position for a trip around town.  Our ground-breaking design provides optimum comfort.", ListPrice=333.4200, Weight=3.10, Color="Blue", ImageUri = new Uri(ImageServerPath + "touring_frame_blue_large.jpg")});
 274:             products.Add(new Product { Currency="USD", Title = "LL Touring Frame - Blue, 54", ProductNumber="FR-T67U-54", SubcategoryId=16, Description="Lightweight butted aluminum frame provides a more upright riding position for a trip around town.  Our ground-breaking design provides optimum comfort.", ListPrice=333.4200, Weight=3.14, Color="Blue", ImageUri = new Uri(ImageServerPath + "touring_frame_blue_large.jpg")});
 275:             products.Add(new Product { Currency="USD", Title = "LL Touring Frame - Blue, 58", ProductNumber="FR-T67U-58", SubcategoryId=16, Description="Lightweight butted aluminum frame provides a more upright riding position for a trip around town.  Our ground-breaking design provides optimum comfort.", ListPrice=333.4200, Weight=3.16, Color="Blue", ImageUri = new Uri(ImageServerPath + "touring_frame_blue_large.jpg")});
 276:             products.Add(new Product { Currency="USD", Title = "LL Touring Frame - Blue, 62", ProductNumber="FR-T67U-62", SubcategoryId=16, Description="Lightweight butted aluminum frame provides a more upright riding position for a trip around town.  Our ground-breaking design provides optimum comfort.", ListPrice=333.4200, Weight=3.20, Color="Blue", ImageUri = new Uri(ImageServerPath + "touring_frame_blue_large.jpg")});
 277:             products.Add(new Product { Currency="USD", Title = "LL Touring Frame - Yellow, 44", ProductNumber="FR-T67Y-44", SubcategoryId=16, Description="Lightweight butted aluminum frame provides a more upright riding position for a trip around town.  Our ground-breaking design provides optimum comfort.", ListPrice=333.4200, Weight=3.02, Color="Yellow", ImageUri = new Uri(ImageServerPath + "touring_frame_yellow_large.jpg")});
 278:             products.Add(new Product { Currency="USD", Title = "LL Touring Frame - Yellow, 50", ProductNumber="FR-T67Y-50", SubcategoryId=16, Description="Lightweight butted aluminum frame provides a more upright riding position for a trip around town.  Our ground-breaking design provides optimum comfort.", ListPrice=333.4200, Weight=3.10, Color="Yellow", ImageUri = new Uri(ImageServerPath + "touring_frame_yellow_large.jpg")});
 279:             products.Add(new Product { Currency="USD", Title = "LL Touring Frame - Yellow, 54", ProductNumber="FR-T67Y-54", SubcategoryId=16, Description="Lightweight butted aluminum frame provides a more upright riding position for a trip around town.  Our ground-breaking design provides optimum comfort.", ListPrice=333.4200, Weight=3.14, Color="Yellow", ImageUri = new Uri(ImageServerPath + "touring_frame_yellow_large.jpg")});            
 280:             products.Add(new Product { Currency="USD", Title = "LL Touring Frame - Yellow, 58", ProductNumber="FR-T67Y-58", SubcategoryId=16, Description="Lightweight butted aluminum frame provides a more upright riding position for a trip around town.  Our ground-breaking design provides optimum comfort.", ListPrice=333.4200, Weight=3.16, Color="Yellow", ImageUri = new Uri(ImageServerPath + "touring_frame_yellow_large.jpg")});            
 281:             products.Add(new Product { Currency="USD", Title = "LL Touring Frame - Blue, 44", ProductNumber="FR-T67U-44", SubcategoryId=16, Description="Lightweight butted aluminum frame provides a more upright riding position for a trip around town.  Our ground-breaking design provides optimum comfort.", ListPrice=333.4200, Weight=3.02, Color="Blue", ImageUri = new Uri(ImageServerPath + "touring_frame_blue_large.jpg")});            
 282:             products.Add(new Product { Currency="USD", Title = "HL Touring Frame - Yellow, 60", ProductNumber="FR-T98Y-60", SubcategoryId=16, Description="The HL aluminum frame is custom-shaped for both good looks and strength; it will withstand the most rigorous challenges of daily riding. Men's version.", ListPrice=1003.9100, Weight=3.08, Color="Yellow", ImageUri = new Uri(ImageServerPath + "touring_frame_yellow_large.jpg")});
 283:             products.Add(new Product { Currency="USD", Title = "HL Touring Frame - Yellow, 46", ProductNumber="FR-T98Y-46", SubcategoryId=16, Description="The HL aluminum frame is custom-shaped for both good looks and strength; it will withstand the most rigorous challenges of daily riding. Men's version.", ListPrice=1003.9100, Weight=2.96, Color="Yellow", ImageUri = new Uri(ImageServerPath + "touring_frame_yellow_large.jpg")});
 284:             products.Add(new Product { Currency="USD", Title = "HL Touring Frame - Yellow, 50", ProductNumber="FR-T98Y-50", SubcategoryId=16, Description="The HL aluminum frame is custom-shaped for both good looks and strength; it will withstand the most rigorous challenges of daily riding. Men's version.", ListPrice=1003.9100, Weight=3.00, Color="Yellow", ImageUri = new Uri(ImageServerPath + "touring_frame_yellow_large.jpg")});
 285:             products.Add(new Product { Currency="USD", Title = "HL Touring Frame - Yellow, 54", ProductNumber="FR-T98Y-54", SubcategoryId=16, Description="The HL aluminum frame is custom-shaped for both good looks and strength; it will withstand the most rigorous challenges of daily riding. Men's version.", ListPrice=1003.9100, Weight=3.04, Color="Yellow", ImageUri = new Uri(ImageServerPath + "touring_frame_yellow_large.jpg")});            
 286:             products.Add(new Product { Currency="USD", Title = "HL Touring Frame - Blue, 46", ProductNumber="FR-T98U-46", SubcategoryId=16, Description="The HL aluminum frame is custom-shaped for both good looks and strength; it will withstand the most rigorous challenges of daily riding. Men's version.", ListPrice=1003.9100, Weight=2.96, Color="Blue", ImageUri = new Uri(ImageServerPath + "touring_frame_blue_large.jpg")});
 287:             products.Add(new Product { Currency="USD", Title = "HL Touring Frame - Blue, 50", ProductNumber="FR-T98U-50", SubcategoryId=16, Description="The HL aluminum frame is custom-shaped for both good looks and strength; it will withstand the most rigorous challenges of daily riding. Men's version.", ListPrice=1003.9100, Weight=3.00, Color="Blue", ImageUri = new Uri(ImageServerPath + "touring_frame_blue_large.jpg")});
 288:             products.Add(new Product { Currency="USD", Title = "HL Touring Frame - Blue, 54", ProductNumber="FR-T98U-54", SubcategoryId=16, Description="The HL aluminum frame is custom-shaped for both good looks and strength; it will withstand the most rigorous challenges of daily riding. Men's version.", ListPrice=1003.9100, Weight=3.04, Color="Blue", ImageUri = new Uri(ImageServerPath + "touring_frame_blue_large.jpg")});
 289:             products.Add(new Product { Currency="USD", Title = "HL Touring Frame - Blue, 60", ProductNumber="FR-T98U-60", SubcategoryId=16, Description="The HL aluminum frame is custom-shaped for both good looks and strength; it will withstand the most rigorous challenges of daily riding. Men's version.", ListPrice=1003.9100, Weight=3.08, Color="Blue", ImageUri = new Uri(ImageServerPath + "touring_frame_blue_large.jpg")});
 290:             products.Add(new Product { Currency="USD", Title = "Taillights - Battery-Powered", ProductNumber="LT-T990", SubcategoryId=33, Description="Affordable light for safe night riding - uses 3 AAA batteries", ListPrice=13.9900, Weight=0, Color="saphire", ImageUri = new Uri(ImageServerPath + "tail_lights_large.jpg")});
 291:             products.Add(new Product { Currency="USD", Title = "Road Bottle Cage", ProductNumber="BC-R205", SubcategoryId=28, Description="Aluminum cage is lighter than our mountain version; perfect for long distance trips.", ListPrice=8.9900, Weight=0, Color="saphire", ImageUri = new Uri(ImageServerPath + "water_bottle_cage_large.jpg")});
 292:             products.Add(new Product { Currency="USD", Title = "Water Bottle - 30 oz.", ProductNumber="WB-H098", SubcategoryId=28, Description="AWC logo water bottle - holds 30 oz; leak-proof.", ListPrice=4.9900, Weight=0, Color="saphire", ImageUri = new Uri(ImageServerPath + "water_bottle_large.jpg")});
 293:             products.Add(new Product { Currency="USD", Title = "Hitch Rack - 4-Bike", ProductNumber="RA-H123", SubcategoryId=26, Description="Carries 4 bikes securely; steel construction, fits 2\" receiver hitch.", ListPrice=120.0000, Weight=0, Color="saphire", ImageUri = new Uri(ImageServerPath + "hitch_rack.jpg")});
 294:             products.Add(new Product { Currency = "USD", Title = "Fender Set - Mountain", ProductNumber = "FE-6654", SubcategoryId = 30, Description = "Clip-on fenders fit most mountain bikes.", ListPrice = 21.9800, Weight = 0, Color = "saphire", ImageUri = new Uri(ImageServerPath + "mtn_fender_set.jpg") });
 295:             products.Add(new Product { Currency="USD", Title = "Mountain Bike Socks, M", ProductNumber="SO-B909-M", SubcategoryId=23, Description="Combination of natural and synthetic fibers stays dry and provides just the right cushioning.", ListPrice=9.5000, Weight=0, Color="White", ImageUri = new Uri(ImageServerPath + "mtn _socks.jpg")});
 296:             products.Add(new Product { Currency = "USD", Title = "Mountain Bike Socks, L", ProductNumber = "SO-B909-L", SubcategoryId = 23, Description = "Combination of natural and synthetic fibers stays dry and provides just the right cushioning.", ListPrice = 9.5000, Weight = 0, Color = "White", ImageUri = new Uri(ImageServerPath + "mtn _socks.jpg") });
 297:             products.Add(new Product { Currency="USD", Title = "Minipump", ProductNumber="PU-0452", SubcategoryId=36, Description="Designed for convenience. Fits in your pocket. Aluminum barrel. 160psi rated.", ListPrice=19.9900, Weight=0, Color="saphire", ImageUri = new Uri(ImageServerPath + "handpump_large.jpg")});
 298:             products.Add(new Product { Currency="USD", Title = "Men's Bib-Shorts, S", ProductNumber="SB-M891-S", SubcategoryId=18, Description="Designed for the AWC team with stay-put straps, moisture-control, chamois padding, and leg grippers.", ListPrice=89.9900, Weight=0, Color="Multi", ImageUri = new Uri(ImageServerPath + "shorts_male_large.jpg")});
 299:             products.Add(new Product { Currency="USD", Title = "Men's Bib-Shorts, M", ProductNumber="SB-M891-M", SubcategoryId=18, Description="Designed for the AWC team with stay-put straps, moisture-control, chamois padding, and leg grippers.", ListPrice=89.9900, Weight=0, Color="Multi", ImageUri = new Uri(ImageServerPath + "shorts_male_large.jpg")});
 300:             products.Add(new Product { Currency="USD", Title = "Men's Bib-Shorts, L", ProductNumber="SB-M891-L", SubcategoryId=18, Description="Designed for the AWC team with stay-put straps, moisture-control, chamois padding, and leg grippers.", ListPrice=89.9900, Weight=0, Color="Multi", ImageUri = new Uri(ImageServerPath + "shorts_male_large.jpg")});
 301:             products.Add(new Product { Currency="USD", Title = "Touring-Panniers, Large", ProductNumber="PA-T100", SubcategoryId=35, Description="Durable, water-proof nylon construction with easy access. Large enough for weekend trips.", ListPrice=125.0000, Weight=0, Color="Grey", ImageUri = new Uri(ImageServerPath + "touring_panniers.jpg")});
 302:             products.Add(new Product { Currency="USD", Title = "Half-Finger Gloves, S", ProductNumber="GL-H102-S", SubcategoryId=20, Description="Full padding, improved finger flex, durable palm, adjustable closure.", ListPrice=24.4900, Weight=0, Color="Black", ImageUri = new Uri(ImageServerPath + "half_finger_gloves.jpg")});
 303:             products.Add(new Product { Currency="USD", Title = "Half-Finger Gloves, M", ProductNumber="GL-H102-M", SubcategoryId=20, Description="Full padding, improved finger flex, durable palm, adjustable closure.", ListPrice=24.4900, Weight=0, Color="Black", ImageUri = new Uri(ImageServerPath + "half_finger_gloves.jpg")});
 304:             products.Add(new Product { Currency="USD", Title = "Half-Finger Gloves, L", ProductNumber="GL-H102-L", SubcategoryId=20, Description="Full padding, improved finger flex, durable palm, adjustable closure.", ListPrice=24.4900, Weight=0, Color="Black", ImageUri = new Uri(ImageServerPath + "half_finger_gloves.jpg")});            
 305:             products.Add(new Product { Currency="USD", Title = "Women's Mountain Shorts, S", ProductNumber="SH-W890-S", SubcategoryId=22, Description="Heavy duty, abrasion-resistant shorts feature seamless, lycra inner shorts with anti-bacterial chamois for comfort.", ListPrice=69.9900, Weight=0, Color="Black", ImageUri = new Uri(ImageServerPath + "shorts_female_large.jpg")});
 306:             products.Add(new Product { Currency="USD", Title = "Women's Mountain Shorts, M", ProductNumber="SH-W890-M", SubcategoryId=22, Description="Heavy duty, abrasion-resistant shorts feature seamless, lycra inner shorts with anti-bacterial chamois for comfort.", ListPrice=69.9900, Weight=0, Color="Black", ImageUri = new Uri(ImageServerPath + "shorts_female_large.jpg")});
 307:             products.Add(new Product { Currency="USD", Title = "Women's Mountain Shorts, L", ProductNumber="SH-W890-L", SubcategoryId=22, Description="Heavy duty, abrasion-resistant shorts feature seamless, lycra inner shorts with anti-bacterial chamois for comfort.", ListPrice=69.9900, Weight=0, Color="Black", ImageUri = new Uri(ImageServerPath + "shorts_female_large.jpg")});
 308:             products.Add(new Product { Currency="USD", Title = "Patch Kit/8 Patches", ProductNumber="PK-7098", SubcategoryId=37, Description="Includes 8 different size patches, glue and sandpaper.", ListPrice=2.2900, Weight=0, Color="saphire", ImageUri = new Uri(ImageServerPath + "tirepatch_kit_large.jpg")});
 309:             products.Add(new Product { Currency="USD", Title = "Classic Vest, S", ProductNumber="VE-C304-S", SubcategoryId=25, Description="Light-weight, wind-resistant, packs to fit into a pocket.", ListPrice=63.5000, Weight=0, Color="Blue", ImageUri = new Uri(ImageServerPath + "classic_vest.jpg")});
 310:             products.Add(new Product { Currency = "USD", Title = "Classic Vest, M", ProductNumber = "VE-C304-M", SubcategoryId = 25, Description = "Light-weight, wind-resistant, packs to fit into a pocket.", ListPrice = 63.5000, Weight = 0, Color = "Blue", ImageUri = new Uri(ImageServerPath + "classic_vest.jpg") });
 311:             products.Add(new Product { Currency = "USD", Title = "Classic Vest, L", ProductNumber = "VE-C304-L", SubcategoryId = 25, Description = "Light-weight, wind-resistant, packs to fit into a pocket.", ListPrice = 63.5000, Weight = 0, Color = "Blue", ImageUri = new Uri(ImageServerPath + "classic_vest.jpg") });
 312:             products.Add(new Product { Currency="USD", Title = "Men's Sports Shorts, S", ProductNumber="SH-M897-S", SubcategoryId=22, Description="Men's 8-panel racing shorts - lycra with an elastic waistband and leg grippers.", ListPrice=59.9900, Weight=0, Color="Black", ImageUri = new Uri(ImageServerPath + "bike_shorts_male_large.jpg")});
 313:             products.Add(new Product { Currency="USD", Title = "Men's Sports Shorts, M", ProductNumber="SH-M897-M", SubcategoryId=22, Description="Men's 8-panel racing shorts - lycra with an elastic waistband and leg grippers.", ListPrice=59.9900, Weight=0, Color="Black", ImageUri = new Uri(ImageServerPath + "bike_shorts_male_large.jpg")});
 314:             products.Add(new Product { Currency="USD", Title = "Men's Sports Shorts, L", ProductNumber="SH-M897-L", SubcategoryId=22, Description="Men's 8-panel racing shorts - lycra with an elastic waistband and leg grippers.", ListPrice=59.9900, Weight=0, Color="Black", ImageUri = new Uri(ImageServerPath + "bike_shorts_male_large.jpg")});
 315:             products.Add(new Product { Currency="USD", Title = "Men's Sports Shorts, XL", ProductNumber="SH-M897-X", SubcategoryId=22, Description="Men's 8-panel racing shorts - lycra with an elastic waistband and leg grippers.", ListPrice=59.9900, Weight=0, Color="Black", ImageUri = new Uri(ImageServerPath + "bike_shorts_male_large.jpg")});
 316:             products.Add(new Product { Currency = "USD", Title = "All-Purpose Bike Stand", ProductNumber = "ST-1401", SubcategoryId = 27, Description = "Perfect all-purpose bike stand for working on your bike at home. Quick-adjusting clamps and steel construction.", ListPrice = 159.0000, Weight = 0, Color = "saphire", ImageUri = new Uri(ImageServerPath + "bike_stand.jpg") });
 317:             products.Add(new Product { Currency="USD", Title = "Headlights - Dual-Beam", ProductNumber="LT-H902", SubcategoryId=33, Description="Rechargeable dual-beam headlight.", ListPrice=34.9900, Weight=0, Color="saphire", ImageUri = new Uri(ImageServerPath + "double_headlight_large.jpg")});
 318:             products.Add(new Product { Currency="USD", Title = "Headlights - Weatherproof", ProductNumber="LT-H903", SubcategoryId=33, Description="Rugged weatherproof headlight.", ListPrice=44.9900, Weight=0, Color="saphire", ImageUri = new Uri(ImageServerPath + "double_headlight_large.jpg")});
 319:             products.Add(new Product { Currency="USD", Title = "Short-Sleeve Classic Jersey, S", ProductNumber="SJ-0194-S", SubcategoryId=21, Description="Short sleeve classic breathable jersey with superior moisture control, front zipper, and 3 back pockets.", ListPrice=53.9900, Weight=0, Color="Yellow", ImageUri = new Uri(ImageServerPath + "awc_tee_male_large.jpg")});
 320:             products.Add(new Product { Currency="USD", Title = "Short-Sleeve Classic Jersey, M", ProductNumber="SJ-0194-M", SubcategoryId=21, Description="Short sleeve classic breathable jersey with superior moisture control, front zipper, and 3 back pockets.", ListPrice=53.9900, Weight=0, Color="Yellow", ImageUri = new Uri(ImageServerPath + "awc_tee_male_large.jpg")});
 321:             products.Add(new Product { Currency="USD", Title = "Short-Sleeve Classic Jersey, L", ProductNumber="SJ-0194-L", SubcategoryId=21, Description="Short sleeve classic breathable jersey with superior moisture control, front zipper, and 3 back pockets.", ListPrice=53.9900, Weight=0, Color="Yellow", ImageUri = new Uri(ImageServerPath + "awc_tee_male_large.jpg")});
 322:             products.Add(new Product { Currency="USD", Title = "Short-Sleeve Classic Jersey, XL", ProductNumber="SJ-0194-X", SubcategoryId=21, Description="Short sleeve classic breathable jersey with superior moisture control, front zipper, and 3 back pockets.", ListPrice=53.9900, Weight=0, Color="Yellow", ImageUri = new Uri(ImageServerPath + "awc_tee_male_large.jpg")});
 323:             products.Add(new Product { Currency = "USD", Title = "Bike Tee Shirt", ProductNumber = "SJ-0194-XL", SubcategoryId = 21, Description = "Woodinville bicycle tee shirt.", ListPrice = 24.9900, Weight = 0, Color = "Yellow", ImageUri = new Uri(ImageServerPath + "woodinville_bicycle.jpg") });
 324:             products.Add(new Product { Currency="USD", Title = "Mountain Pump", ProductNumber="PU-M044", SubcategoryId=36, Description="Simple and light-weight. Emergency patches stored in handle.", ListPrice=24.9900, Weight=0, Color="saphire", ImageUri = new Uri(ImageServerPath + "bikepump_large.jpg")});
 325:             products.Add(new Product { Currency="USD", Title = "Racing Socks, M", ProductNumber="SO-R809-M", SubcategoryId=23, Description="Thin, lightweight and durable with cuffs that stay up.", ListPrice=8.9900, Weight=0, Color="White", ImageUri = new Uri(ImageServerPath + "race_socks.jpg")});
 326:             products.Add(new Product { Currency = "USD", Title = "Racing Socks, L", ProductNumber = "SO-R809-L", SubcategoryId = 23, Description = "Thin, lightweight and durable with cuffs that stay up.", ListPrice = 8.9900, Weight = 0, Color = "White", ImageUri = new Uri(ImageServerPath + "race_socks.jpg") });
 327:             products.Add(new Product { Currency="USD", Title = "Mountain Bottle Cage", ProductNumber="BC-M005", SubcategoryId=28, Description="Tough aluminum cage holds bottle securly on tough terrain.", ListPrice=9.9900, Weight=0, Color="saphire", ImageUri = new Uri(ImageServerPath + "water_bottle_cage_large.jpg")});
 328:             products.Add(new Product { Currency = "USD", Title = "AWC Logo Cap", ProductNumber = "CA-1098", SubcategoryId = 19, Description = "Traditional style with a flip-up brim; one-size fits all.", ListPrice = 8.9900, Weight = 0, Color = "Multi", ImageUri = new Uri(ImageServerPath + "logo_cap.jpg") });
 329:             products.Add(new Product { Currency="USD", Title = "Long-Sleeve Logo Jersey, S", ProductNumber="LJ-0192-S", SubcategoryId=21, Description="Unisex long-sleeve AWC logo microfiber cycling jersey", ListPrice=49.9900, Weight=0, Color="Multi", ImageUri = new Uri(ImageServerPath + "awc_jersey_male_large.jpg")});
 330:             products.Add(new Product { Currency="USD", Title = "Long-Sleeve Logo Jersey, M", ProductNumber="LJ-0192-M", SubcategoryId=21, Description="Unisex long-sleeve AWC logo microfiber cycling jersey", ListPrice=49.9900, Weight=0, Color="Multi", ImageUri = new Uri(ImageServerPath + "awc_jersey_male_large.jpg")});
 331:             products.Add(new Product { Currency="USD", Title = "Long-Sleeve Logo Jersey, L", ProductNumber="LJ-0192-L", SubcategoryId=21, Description="Unisex long-sleeve AWC logo microfiber cycling jersey", ListPrice=49.9900, Weight=0, Color="Multi", ImageUri = new Uri(ImageServerPath + "awc_jersey_male_large.jpg")});
 332:             products.Add(new Product { Currency="USD", Title = "Long-Sleeve Logo Jersey, XL", ProductNumber="LJ-0192-X", SubcategoryId=21, Description="Unisex long-sleeve AWC logo microfiber cycling jersey", ListPrice=49.9900, Weight=0, Color="Multi", ImageUri = new Uri(ImageServerPath + "awc_jersey_male_large.jpg")});
 333:             products.Add(new Product { Currency="USD", Title = "Sport-100 Helmet, Red", ProductNumber="HL-U509-R", SubcategoryId=31, Description="Universal fit, well-vented, lightweight , snap-on visor.", ListPrice=34.9900, Weight=0, Color="Red", ImageUri = new Uri(ImageServerPath + "sport_helmet_red.jpg")});
 334:             products.Add(new Product { Currency="USD", Title = "Sport-100 Helmet, Black", ProductNumber="HL-U509", SubcategoryId=31, Description="Universal fit, well-vented, lightweight , snap-on visor.", ListPrice=34.9900, Weight=0, Color="Black", ImageUri = new Uri(ImageServerPath + "sport_helmet_red.jpg")});
 335:             products.Add(new Product { Currency="USD", Title = "Sport-100 Helmet, Blue", ProductNumber="HL-U509-B", SubcategoryId=31, Description="Universal fit, well-vented, lightweight , snap-on visor.", ListPrice=34.9900, Weight=0, Color="Blue", ImageUri = new Uri(ImageServerPath + "sport_helmet_red.jpg")});
 336:             products.Add(new Product { Currency="USD", Title = "Hydration Pack - 70 oz.", ProductNumber="HY-1023-70", SubcategoryId=32, Description="Versatile 70 oz hydration pack offers extra storage, easy-fill access, and a waist belt.", ListPrice=54.9900, Weight=0, Color="Silver", ImageUri = new Uri(ImageServerPath + "hydration_pack.jpg")});
 337:             products.Add(new Product { Currency="USD", Title = "Women's Tights, S", ProductNumber="TG-W091-S", SubcategoryId=24, Description="Warm spandex tights for winter riding; seamless chamois construction eliminates pressure points.", ListPrice=74.9900, Weight=0, Color="Black", ImageUri = new Uri(ImageServerPath + "tights_female.jpg")});
 338:             products.Add(new Product { Currency="USD", Title = "Women's Tights, M", ProductNumber="TG-W091-M", SubcategoryId=24, Description="Warm spandex tights for winter riding; seamless chamois construction eliminates pressure points.", ListPrice=74.9900, Weight=0, Color="Black", ImageUri = new Uri(ImageServerPath + "tights_female.jpg")});
 339:             products.Add(new Product { Currency="USD", Title = "Women's Tights, L", ProductNumber="TG-W091-L", SubcategoryId=24, Description="Warm spandex tights for winter riding; seamless chamois construction eliminates pressure points.", ListPrice=74.9900, Weight=0, Color="Black", ImageUri = new Uri(ImageServerPath + "tights_female.jpg")});
 340:             products.Add(new Product { Currency="USD", Title = "Bike Wash - Dissolver", ProductNumber="CL-9009", SubcategoryId=29, Description="Washes off the toughest road grime; dissolves grease, environmentally safe. 1-liter bottle.", ListPrice=7.9500, Weight=0, Color="saphire", ImageUri = new Uri(ImageServerPath + "bike_wash.jpg")});
 341:             products.Add(new Product { Currency="USD", Title = "Cable Lock", ProductNumber="LO-C100", SubcategoryId=34, Description="Wraps to fit front and rear tires, carrier and 2 keys included.", ListPrice=25.0000, Weight=0, Color="saphire", ImageUri = new Uri(ImageServerPath + "bike_lock_large.jpg")});
 342:             products.Add(new Product { Currency="USD", Title = "LL Mountain Rear Wheel", ProductNumber="RW-M423", SubcategoryId=17, Description="Replacement mountain wheel for entry-level rider.", ListPrice=87.7450, Weight=0, Color="Black", ImageUri = new Uri(ImageServerPath + "wheel_large.jpg")});
 343:             products.Add(new Product { Currency="USD", Title = "ML Mountain Rear Wheel", ProductNumber="RW-M762", SubcategoryId=17, Description="Replacement mountain wheel for the casual to serious rider.", ListPrice=236.0250, Weight=0, Color="Black", ImageUri = new Uri(ImageServerPath + "wheel_large.jpg")});
 344:             products.Add(new Product { Currency="USD", Title = "HL Mountain Rear Wheel", ProductNumber="RW-M928", SubcategoryId=17, Description="High-performance mountain replacement wheel.", ListPrice=327.2150, Weight=0, Color="Black", ImageUri = new Uri(ImageServerPath + "wheel_large.jpg")});
 345:             products.Add(new Product { Currency="USD", Title = "LL Road Rear Wheel", ProductNumber="RW-R623", SubcategoryId=17, Description="Replacement road rear wheel for entry-level cyclist.", ListPrice=112.5650, Weight=1050.00, Color="Black", ImageUri = new Uri(ImageServerPath + "wheel_large.jpg")});
 346:             products.Add(new Product { Currency = "USD", Title = "Rear Derailleur", ProductNumber = "RD-2308", SubcategoryId = 9, Description = "Wide-link design.", ListPrice = 121.4600, Weight = 215.00, Color = "Silver", ImageUri = new Uri(ImageServerPath + "sprocket_large.jpg")});
 347:return products;
 348:         }
 349:  
 350:privatestatic IEnumerable<Product> GetTodaysDeals()
 351:         {
 352:             var promotedProducts = new List<Product>();
 353:             promotedProducts.Add(_products.First(p => p.ProductNumber == "BK-M38S-42"));
 354:             promotedProducts.Add(_products.First(p => p.ProductNumber == "BK-R19B-52"));
 355:             promotedProducts.Add(_products.First(p => p.ProductNumber == "FK-9939"));
 356:             promotedProducts.Add(_products.First(p => p.ProductNumber == "FR-M94S-42"));
 357:             promotedProducts.Add(_products.First(p => p.ProductNumber == "HB-M243"));
 358:return promotedProducts;
 359:         }
 360:     }
 361: }

Models フォルダ:Products.cs

   1:// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
   2:// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
   3:// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
   4:// PARTICULAR PURPOSE.
   5://
   6:// Copyright (c) Microsoft Corporation. All rights reserved
   7:  
   8:  
   9:using System;
  10:  
  11:namespace AdventureWorks.WebServices.Models
  12: {
  13:publicclass Product
  14:     {
  15:publicstring ProductNumber { get; set; }
  16:  
  17:publicstring Title { get; set; }
  18:  
  19:publicstring Description { get; set; }
  20:  
  21:public Uri ImageUri { get; set; }
  22:  
  23:publicint SubcategoryId { get; set; }
  24:  
  25:publicdouble ListPrice { get; set; }
  26:  
  27:publicdouble DiscountPercentage { get; set; }
  28:  
  29:publicdouble Weight { get; set; }
  30:  
  31:publicstring Color { get; set; }
  32:  
  33:publicstring Currency { get; set; }
  34:     }
  35: }

Controllers フォルダ:ProductController

   1:// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
   2:// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
   3:// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
   4:// PARTICULAR PURPOSE.
   5://
   6:// Copyright (c) Microsoft Corporation. All rights reserved
   7:  
   8:  
   9:using AdventureWorks.WebServices.Models;
  10:using AdventureWorks.WebServices.Repositories;
  11:using System.Collections.Generic;
  12:using System.Linq;
  13:using System.Net;
  14:using System.Web.Http;
  15:  
  16:namespace AdventureWorks.WebServices.Controllers
  17: {
  18:publicclass ProductController : ApiController
  19:     {
  20:// Another approach to bounding the search result set to a fixed number is to
  21:// implement ISupportIncrementalLoading
  22:privateconstint MaxSearchResults = 1000;
  23:  
  24:private IProductRepository _productRepository;
  25:  
  26:public ProductController()
  27:             : this(new ProductRepository())
  28:         { }
  29:  
  30:public ProductController(IProductRepository productRepository)
  31:         {
  32:             _productRepository = productRepository;
  33:         }
  34:  
  35:// GET /api/Product
  36:public IEnumerable<Product> GetProducts()
  37:         {
  38:return _productRepository.GetProducts();
  39:         }
  40:  
  41:// GET /api/Product/id
  42:public Product GetProduct(string id)
  43:         {
  44:             var item = _productRepository.GetProduct(id);
  45:  
  46:if (item == null)
  47:             {
  48:thrownew HttpResponseException(HttpStatusCode.NotFound);
  49:             }
  50:  
  51:return item;
  52:         }
  53:  
  54:// GET /api/Product?queryString={queryString}
  55:public SearchResult GetSearchResults(string queryString, int maxResults)
  56:         {
  57:             var fullsearchResult = _productRepository.GetProducts().Where(p => p.Title.ToUpperInvariant().Contains(queryString.ToUpperInvariant()));
  58:
  59:             var searchResult = new SearchResult
  60:                                    {
  61:                                        TotalCount = fullsearchResult.Count(),
  62:                                        Products = fullsearchResult.Take(maxResults > 0 ? maxResults : MaxSearchResults)
  63:                                    };
  64:  
  65:return searchResult;
  66:  
  67:         }
  68:  
  69:// GET /api/Product?categoryId={categoryId}
  70:public IEnumerable<Product> GetProducts(int categoryId)
  71:         {
  72:if (categoryId == 0)
  73:             {
  74:return _productRepository.GetTodaysDealsProducts();
  75:             }
  76:  
  77:return _productRepository.GetProductsForCategory(categoryId);
  78:         }
  79:     }
  80: }

このソリューションサンプルでは、ローカルでイメージファイルとテキストファイルをインサートしていますが、実際のプロジェクトでは、この部分を、Entity FrameworkでO/Rマッピングして、ASP.NET Web APIREST のサービスとして公開して JSONペイロードを使って HTTP Clientの上で CRUD処理を行う、という形にしてやれば OK です。これに関しては、我々 Windows ストア 業務アプリチームが開催している、業務アプリ開発ハンズオンラボにお越し戴けると、わかり易いと思います。上記の部分はこんなイメージです。これ、SQL Expressでも Azure SQL Databaseでも実施済みです。

image

4.5時間で、SQL と連携した、ストア ビジネス(業務)アプリの作り方をハンズオン形式で習得して戴けます。こちらが4月分ですが、5月、6月も開催予定ですので、興味おありの方はぜひ!

4/22開催→ http://aka.ms/Mnaanv

image

認証の話

そして、認証に関しては、セッションでもご紹介し他通り、こちらが全体像になります。

image

これに関しては以前、まさにこのビューで Blog に詳しく書いてありますので、ぜひご参照ください。

http://blogs.msdn.com/b/shosuz/archive/2013/12/25/windows-8-1.aspx

image 

疎結合コンポーネント間通信

最後に 疎結合コンポーネント間通信を取り上げます。ここの部分は、QuickStart の部分の解説とデモをご参照ください。セッションでもここにある通りでしたので、特に付記する部分はありません。

--- 疎結合コンポーネント間の通信

イベント集約を利用するとアプリ内で疎結合コンポーネント間の通信が可能になり、コンポーネントに互いの参照を設定する必要がなくなります。次の一覧に、アプリでイベント集約を使う際に決定しておく事項をまとめています。

  • Microsoft .NET イベントではなくイベント集約を使うのはどのような場合か。
  • パブ/サブ イベントをどのように受信登録するか。
  • イベントがバックグラウンド スレッドから発行された場合にサブスクライバーはどのような方法で UI を更新できるか。
  • サブスクライバーは発行されたイベントのすべてのインスタンスを処理する必要があるか。
  • 受信登録しているイベントを解除する必要があるか。

.NET イベントは発行/受信登録パターンを実装します。パブリッシャーとサブスクライバーの有効期間は互いのオブジェクト参照によって結合され、サブスクライバーの型にはパブリッシャーの型への参照が必要です。

イベント集約は、オブジェクト参照と型参照でリンクすると不都合なクラス間の通信を可能にする設計パターンです。このメカニズムにより、パブリッシャーとサブスクライバーは互いに参照し合うことなく通信できます。 そのため、.NET イベントは既にオブジェクト参照の関係があるコンポーネント間 (コントロールとそれ自体を含むページなど) の通信に使い、イベント集約は疎結合コンポーネント間 (アプリの 2 つの個別のページ ビュー モデルなど) の通信に使います。詳しくは、「イベント集約」をご覧ください。

イベント集約を使う場合にイベントを受信登録するには、いくつかの方法があります。最も簡単な方法は、パブリッシャーのスレッドで呼び出されるイベント ハンドラー メソッドのデリゲート参照を登録する方法です。詳しくは、「イベントの受信登録」をご覧ください。

イベントを受け取ると UI 要素を更新できるようにするには、イベントを UI スレッドで受け取るように登録します。

パブ/サブ イベントを受信登録する場合は、イベントの通知が UI スレッドに行われるように要求できます。これは、イベントに応じて UI を更新する必要がある場合などに便利です。詳しくは、「UI スレッドでの受信登録」をご覧ください。

サブスクライバーは、発行されたイベントのすべてのインスタンスを処理する必要はありません。これは、発行されたイベントのペイロードがサブスクライバー コールバックの呼び出しに必要な一連の条件に一致するかどうかを判断するイベントが発行されたときに実行されるデリゲートを指定できるためです。詳しくは、「受信登録のフィルター処理」をご覧ください。

既定では、イベント集約は、サブスクライバーのハンドラーへの弱デリゲート参照を保持します。つまり、参照がサブスクライバーのガベージ コレクションの妨げにならないため、サブスクライバーは受信登録を解除する必要がありません。イベントのパフォーマンスの問題が確認された場合は、イベントを受信登録するときに強参照のデリゲートを使い、不要になったらイベントの受信登録を解除することができます。詳しくは、「強参照を使った受信登録」をご覧ください。

---

イベント集約のクイック スタート

イベント集約のクイック スタート アプリ ページ

QuickStart 関連ソースコード:https://prismwindowsruntime.codeplex.com/releases/view/106870

次回は、ユーザー入力の検証のデモで、いったんこのセッションデモの解説シリーズを終え、どこかのタイミングで Grid テンプレートの Prism を使った MVVM 化の手順を掲載したいと思っています(もっとも、今までの解説でお分かりの通り、ナビゲーションにしても、中断・停止・再開にしても、普通にPrism を使って新たに作った方が簡単かもしれませんが)。

それではまた!

鈴木章太郎


Viewing all articles
Browse latest Browse all 29128

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>