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

我有这个要求,

产品可以有多个图像,只有一个默认图像。 如果属性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("id"), ProductID = tr.Field("productId"), IsDefault = tr.Field("isDefault"), Image = tr.Field("image"), FileName = tr.Field("fileName") }).ToList(); pictureBox1.Image = // ??? conn.Close(); } 

可能这个:

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

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

如果方法是SetDefaultImage ,那将是有意义的

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

或类似的东西。 如果你不需要,可以从数据库中带来额外的东西

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

您甚至不需要使用ToList

您是否只需要为特定产品中的一组选择图像,其中isDefault = true?

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

这是我认为你要求的:

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

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