我有这个要求,
产品可以有多个图像,只有一个默认图像。如果属性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();
}
答案 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并捕获错误。