Linq:链接的对象是null,为什么?

时间:2010-04-10 02:10:09

标签: ado.net linq-to-entities

我有几个链接表(实体)。我正在尝试使用以下linq获取实体:

ObjectQuery<Location> locations = context.Location;
ObjectQuery<ProductPrice> productPrice = context.ProductPrice;
ObjectQuery<Product> products = context.Product;
IQueryable<ProductPrice> res1 = from pp in productPrice
                    join loc in locations
                    on pp.Location equals loc
                    join prod in products
                    on pp.Product equals prod
                    where prod.Title.ToLower().IndexOf(Word.ToLower()) > -1
                    select pp;

此查询返回2条记录,ProductPrice对象具有链接对象Location和Product但它们为null,我无法理解原因。如果我尝试将它们填入linq,如下所示:

res =
                from pp in productPrice
                join loc in locations
                on pp.Location equals loc
                join prod in products
                on pp.Product equals prod
                where prod.Title.ToLower().IndexOf(Word.ToLower()) > -1
                select new ProductPrice
                {
                    ProductPriceId = pp.ProductPriceId,
                    Product = prod
                };

我有一个例外“无法在LINQ to Entities查询中构造实体或复杂类型'PBExplorerData.ProductPrice'” 有人可以解释一下我发生了什么以及我需要做什么? 感谢

1 个答案:

答案 0 :(得分:0)

您的第一个问题的答案是产品和位置为空,因为您需要在查询中添加包含(“”)。

  IQueryable<ProductPrice> res1 = from pp in 
                productPrice.Include("Location").Include("Product")
                  join loc in locations
                    on pp.Location equals loc
                  join prod in products
                    on pp.Product equals prod
                  where prod.Title.ToLower().IndexOf(Word.ToLower()) > -1
                select pp;

第二个问题是EF正试图压低你的查询和ProductPrice(不是实体)所以它不能。如果你想这样做,将它转换为匿名类型,所以只需做

            select new 
            {
                ProductPriceId = pp.ProductPriceId,
                Product = prod
            };

然后再做

          res.ToList().ConvertAll(x=new ProductPrice () {
               ProductPriceId  = x.ProductPriceId ,
               Product  = x.Product

           });

或者你可以通过选择你想要的实体,只需填写手册,以其他方式。