2015-04-20 3 views
2

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

См ниже код тоже вижу, что я пытаюсь сделать:

public DB.store store { get; set; } 
public List<DB.gallery_image> images { get; set; } 
public List<DB.product> products { get; set; } 

public static List<Store> getStoreInfo() 
{ 
    DBDataContext db = new DBDataContext(); 

    var _dataToGet = from _store in db.stores 
        select new Store 
        { 
         store = _store, 
         images = (from a in db.gallery_images 
            where a.albumID == _store.storeID 
            select a).ToList(), 
         products = (from p in db.products 
            where p.storeID = _store.storeID).ToList() 
        }; 

    return _dataToGet.ToList(); 
} 

Так что я просто хочу одну строку из «магазина» таблицы, но список из «образов» и таблицы «продукта». Код выше работает отлично, но медленно, как черт. У меня нет проблем с выбором данных из нескольких таблиц, если в таблице есть только одна (или ни одна) строка, но когда это список, у меня возникает проблема ...

+1

Начнем с того, что это неправильно «где a.albumID == _store.storeID» – Sasse

+0

В зависимости от того решения, которое вы могли бы написать " images = _store.Images.ToList() "и" products = _store.Products.ToList() ". Получаете ли вы желаемый результат, если вы разделите его, чтобы сначала получить все магазины, затем прокрутить их и установить изображения и продукты. (также пишите .ToList()) при загрузке магазинов. – Sasse

+0

Если вы просто выбираете тот же тип, который у вас уже есть, вы можете просто написать «return db.stores.Include (s => s.Images) ... .ToList();" – Sasse

ответ

1

Если бы я был я бы использовал отложенное выполнение, а не материализацию запросов с вызовом ToList. Я бы изменил тип данных images и products на IEnumerable<> вместо List<>. Тогда я не стал бы называть ToList в подзапросах, потому что это приводит к округлению к базе данных, следовательно, в зависимости от того, сколько stores у вас есть, он может превратиться в чрезвычайно медленный запрос.

Вы должны увидеть прирост производительности здесь ...

public DB.store store { get; set; } 
public IEnumerable<DB.gallery_image> images { get; set; } 
public IEnumerable<DB.product> products { get; set; } 

public static List<Store> getStoreInfo() 
{ 
    DBDataContext db = new DBDataContext(); 

    var _dataToGet = from _store in db.stores 
        select new Store 
        { 
         store = _store, 
         images = (from a in db.gallery_images 
            where a.albumID == _store.storeID 
            select a), 
         products = (from p in db.products 
            where p.storeID = _store.storeID) 
        }; 

    return _dataToGet.ToList(); 
} 
Смежные вопросы