日期:2014-05-20  浏览次数:20792 次

EF inclue
EF我关闭了延时加载

现在需要另外一个表

产品表    产品图片mapping表    图片表

搜索产品的时候 怎么include到图片表
------解决方案--------------------
你的意思是不是

- 关闭了 LazyLoading
- 你有 3个表,他们的关系是

  Product 1 --- * ProductImages * --- 1 Images 

- 你想知道怎么读取 Images 的数据?

因为你没有讲清楚你的架构,所以很难给一个完整的答复。

你的 EDMX 里面应该已经有了那些 association, 你的问题最终是在于,你可能有一个

GetProduct(long productId) : Product 

但是当你想要读取 Product.ProductImages 的时候,这个是没有的

那么你可以直接在你的 GetProducts 里面先读了就是

方法有很多,比如

Product GetProduct(long productId)
{
    var query = from p in context.Products where p.ProductId == productId select p;

    Product retval  = query.FirstOrDefault();

    if (retval != null)
    {
        // 这个方法会 create many db round trips 
        if (retval.ProductImages.IsLoaded == false)
        { 
           retval.ProductImages.Load();
           retval.ProductImages.Forreach(e=>e.Image.Load());
        }

        // 这个方法会比较好
        var imageQuery = from i in context.Images 
                  where i.ProductImages.ProductId == productId
                  select i; 

        // 如果你关闭了 lazy loading, 这个会自动加载到相关的 entity 里面,所以不需要赋值
        imageQuery.ToList(); 
    } 

    // 你可以直接写 include, 类似
    var query2 = from p in context.Products.Includes("ProductImages").Include("ProductImages.Images") where p.ProductId == productId select p; 
    
    // 虽然这样只会有一次 db round trip,但实际上并不推荐。关键是你的表里有多少数据,这样一个 join 可能会比上面我推荐的那个方法消耗更大
}

当然还有其他的写法,你自己去捉摸吧