2011-02-07 10 views
2

私はこの要件を持っています。ラムダ式またはlinqでこれを行うには?

製品には複数の画像と1つのデフォルト画像しか存在できません。プロパティーisDefaultがtrueの場合、製品のデフォルト・イメージを判別できます。

は私がLINQとラムダでそれをやってみたいが、私は私のコードでstuckedだ:

private class ProdcutImages 
{ 
    public Int32 ID { get; set; } 
    public String ProductID { get; set; } 
    public Boolean IsDefault { get; set; } 
    public Image Image { get; set; } 
    public String FileName { get; set; } 
} 

public void SetDefaultImage(int productID) 
{ 
    SqlConnection conn = getConnection(); 
    conn.Open(); 
    SqlDataAdapter da = new SqlDataAdapter("SELECT * FROM product_images WHERE product_id = @ID", conn); 
    da.SelectCommand.Parameters.Add(new SqlParameter("@ID", productID)); 


    DataTable dt = new DataTable(); 
    da.Fill(dt); 

    var imageList = (from tr in dt.AsEnumerable() 
         select new ProdcutImages() 
         { 
          ID = tr.Field<int>("id"), 
          ProductID = tr.Field<string>("productId"), 
          IsDefault = tr.Field<bool>("isDefault"), 
          Image = tr.Field<Image>("image"), 
          FileName = tr.Field<string>("fileName") 
         }).ToList(); 

    pictureBox1.Image = // ??? 
    conn.Close(); 
} 
+0

isDefault-flagのSQLチェックを行い、残りのイメージを削除することができます。または、同時にすべての画像を取得する必要がありますか? – NoLifeKing

答えて

2
おそらく

この:

var img = imageList.FirstOrDefault(i => i.IsDefault); 
if (img != null) { pictureBox1.Image = img.Image; } 

や、アカウントに誰かがに忘れてしまったケースを取るために

var img = imageList.FirstOrDefault(i => i.IsDefault) ?? imageList.FirstOrDefault(); 
if (img != null) { pictureBox1.Image = img.Image; } 

(デフォルトでは設定されていない画像が最初に使用されます)

+0

私はlinqが動作しないと思います – yonan2236

+0

ああ、Imageプロパティ。右。固定されている=) – Botz3000

+0

2番目のスニペットはOPの要件を満たしています。これは、使用可能なデフォルト画像がない場合、代わりにリストの最初の画像が使用されるためです。 –

2

方法がSetDefaultImageであれば、それは

SELECT * 
FROM product_images 
WHERE product_id = @ID and is_default = 1 

または類似した何かに意味をなさないと思います。データベースから余分なものを持ち込む ませんポイントあなたは

+0

ああ、他の画像を画像とともにリストボックスに表示する必要があるのは忘れていますが、デフォルトの画像は画像ボックスに表示されています。 – yonan2236

+0

この場合、画像列も必要です。 :) – NoLifeKing

1
pictureBox1.Image = imageList.FirstOrDefault(pi => pi.IsDefault); 

する必要がない場合でも、そのためにToListを使用する必要はありません。

0

isDefault = trueの特定の製品のセットからイメージを選択するだけですか?

少し違ったことをします。私はグローバルに接続文字列(db)を定義していますので、これが正確に動作するかどうかはわかりませんが、メソッドの最初の行を変更できるはずです。

は、ここで私はあなたが求めていると思うものです:

var imageList = db.DataTable 
    .Where(w => w.ID == productID && w.IsDefault == true).FirstOrDefault(); 
pictureBox.Image = imageList.Image; 

のIsDefaultが真である複数の画像がある任意のチャンスがあれば、私はあなたがSingleOrDefaultとトラップにエラーを使用して見てできると思います。

関連する問題