如何在lambda表达式或linq中执行此操作?

时间:2011-02-07 15:32:38

标签: c# linq lambda

我有这个要求,

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

我想在LINQ和lambda中做这件事,但我被困在我的代码中:

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

4 个答案:

答案 0 :(得分: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; }

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

答案 1 :(得分:2)

如果方法是SetDefaultImage,那么

是有意义的
SELECT * 
FROM product_images 
WHERE product_id = @ID and is_default = 1

或类似的东西。 如果你不需要

,从数据库中带来额外的东西是没有意义的

答案 2 :(得分:1)

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

您甚至不需要使用ToList

答案 3 :(得分:0)

您是否只需要为某个特定产品的集合中的图像选择isDefault = true?

我做的事情有点不同。我全局定义了一个连接字符串(db),所以我不确定它是否与你完全一样,但你应该能够修改你方法的第一行。

以下是我认为你要求的内容:

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

如果有多个图像存在多个IsDefault为真的图像,我认为您可以查看使用SingleOrDefault并捕获错误。