2011-02-07 71 views
2

我有这个要求,如何在lambda表达式或linq中做到这一点?

产品可以有多个图像和只有一个默认图像。如果属性isDefault等于true,则可以确定产品的默认图像。

我想这样做的LINQ和lambda但我在我的代码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标志进行SQL检查,以消除其余的图像。或者是否需要同时抓取所有图像? – NoLifeKing 2011-02-07 15:36:16

回答

2

大概这样的:

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

,或者考虑到有人忘了的情况下设置ISDEFAULT领域的任何图像:

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

(这将使用第一个可用的图像,如果没有设置为默认)

+0

我觉得linq不会工作 – yonan2236 2011-02-07 15:39:25

+0

啊,Image属性。对。固定那=) – Botz3000 2011-02-07 15:44:01

2

如果方法SetDefaultImage,它将使意义

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

或类似的东西。 没有点从数据库带来额外的东西,如果你不需要

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和捕获错误。