LINQ для получения значений полей, разделенных разделителем - PullRequest
1 голос
/ 31 мая 2011

У меня есть ситуация, когда мне нужно отобразить ItemID и ItemName из Items таблицы. Допустим, ItemID - это 002, а ItemName - это Apple. У меня есть другое поле с именем SupplementaryItems в таблице, в которой хранятся связанные ItemID , разделенные | (разделитель), что-то вроде 003 | 004 | 005 . Я использую MVC3 с шаблоном хранилища, что-то вроде

var items = _dataContext.items.AsQueryable();
items = from i in items 
          where i.Item_ID.equals(itemId)
           select i;

Приведенный выше запрос с itemId 002 вернет Apple, которая работает нормально. Теперь мне также нужно отобразить все дополнительные элементы с соответствующими им именами элементов, что означает, что мне нужно разбить дополнительный элемент на массив и использовать что-то вроде дополнения. Элемент массив содержит идентификатор элемента. Но в этом случае мне понадобятся два отдельных вызова базы данных, первый из них вернет только элемент с itemID, где я сохраняю AdditionalmentaryItemID в переменной.

 var supplementMaterialsArr = supplementMaterials.ToString().Split('|');

и второй вернет все элементы, и я переберу второй, чтобы получить ItemName из ItemID. К вашему сведению, этот подход требует двух отдельных вызовов из контроллера, что-то вроде

var itemInformationAll = _repository.GetAllItems();
var itemInformation = _repository.GetItemDetailInformation(id); 

Я думаю, что это не очень эффективный подход. У кого-нибудь есть лучшее решение для этого? Должен ли я использовать LINQ self join? Но если я использую self join, смогу ли я получить extrametaryItem с соответствующим им ItemName одним запросом? Любые предложения будут высоко оценены.

1 Ответ

1 голос
/ 31 мая 2011

Это лучшее, что я мог придумать.Это приведет к двум запросам, но никогда не вытянет всю таблицу в память.

var q = from item in
        (from item in TblItems
        where item.ItemID == 1
        select new
        {
            Name = item.ItemName,
            SupplementaryItems = item.SupplementaryItems.Split('|')
        }).AsEnumerable()
        select new
        {
            Name = item.Name,
            SupplementaryItems = TblItems.Where (x => 
                item.SupplementaryItems.Select(y => int.Parse(y))
                .Contains(x.ItemID))
        };

Однако я бы порекомендовал изменить структуру БД, чтобы иметь отдельную таблицу для ссылочных элементов.

...