LINQ to SQL: многоразовое выражение для свойства? - PullRequest
1 голос
/ 16 апреля 2010

Прошу прощения за то, что не смог сформулировать название более точно.

По сути, у меня есть три объекта LINQ, связанных с таблицами. Один из них - «Продукт», другой - «Компания», а последний - таблица сопоставления, в которой хранится информация о том, какая компания продает какие продукты и по какому идентификатору эта компания ссылается на этот продукт.

Я сейчас получаю список продуктов следующим образом:

var options = new DataLoadOptions();
options.LoadWith<Product>(p => p.Mappings);
context.LoadOptions = options;

var products = (
    from p in context.Products
    select new {
        ProductID = p.ProductID,
        //BackendProductID = p.BackendProductID,
        BackendProductID = (p.Mappings.Count == 0)
            ? "None"
            : (p.Mappings.Count > 1)
                ? "Multiple"
                : p.Mappings.First().BackendProductID,
        Description = p.Description
    }
).ToList();

Это делает один запрос, извлекая информацию, которую я хочу. Но я хочу иметь возможность переместить логику за BackendProductID в объект LINQ, чтобы я мог использовать закомментированную строку вместо назойливо вложенных операторов троичного оператора для аккуратности и повторного использования.

Итак, я добавил следующее свойство к объекту Product:

public string BackendProductID
{
    get
    {
        if (Mappings.Count == 0) return "None";
        if (Mappings.Count > 1) return "Multiple";
        return Mappings.First().BackendProductID;
    }
}

Список остается прежним, но теперь он выполняет запрос для каждого отдельного продукта, чтобы получить его BackendProductID. Код более аккуратный и многократно используемый, но производительность сейчас ужасная.

Что мне нужно, это какое-то выражение или делегат, но я не мог придумать, как написать. Это всегда заканчивалось запросом для каждого продукта, все же.

Буду признателен за любую помощь!

1 Ответ

1 голос
/ 16 апреля 2010

Я не могу дать вам лучшее решение, чем ваше, но как обходной путь ...

Может быть, вы могли бы создать представление в базе данных, вы можете перетащить представление в конструктор, как это обычно делается с таблицей. Вы можете прочитать данные из представления. Я думаю, что это улучшит производительность.

Удачи.

...