2015-04-20 169 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来实现查询。我会将数据类型imagesproducts更改为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(); 
} 
相关问题