如何在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并捕获错误。