Как это сделать в лямбда-выражении или linq? - PullRequest
2 голосов
/ 07 февраля 2011

У меня есть это требование,

Продукт может иметь несколько изображений и только одно изображение по умолчанию. Вы можете определить изображение продукта по умолчанию, если свойство 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 ]

2 голосов
/ 07 февраля 2011

Если метод SetDefaultImage, имеет смысл

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

или что-то подобное.Нет смысла брать дополнительные данные из базы данных, если вам не нужно

2 голосов
/ 07 февраля 2011

, вероятно, это:

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 голос
/ 07 февраля 2011
pictureBox1.Image = imageList.FirstOrDefault(pi => pi.IsDefault);

Вам даже не нужно использовать ToList для этого.

0 голосов
/ 07 февраля 2011

Вам просто нужно выбрать изображение из набора для определенного продукта, где isDefault = true?

Я делаю вещи немного по-другому. Я определяю строку подключения глобально (дБ), поэтому я не уверен, работает ли она точно так же, как для вас, но вы должны иметь возможность изменить первую строку для ваших методов.

Вот что, по-моему, вы просите:

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

Если есть вероятность того, что IsDefault имеет значение более одного изображения, я думаю, что вы можете посмотреть на использование SingleOrDefault и перехватить ошибку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...