创建一个LINQ查询,从两个实体中获取数据

本文关键字:实体 两个 获取 数据 查询 一个 LINQ 创建 | 更新日期: 2023-09-27 18:07:52

我想在MVC项目中获得产品类别,并使用它们来创建菜单。该模型驻留在WCF项目上,因此我已将其实例化如下:

ServiceReference1.WSClient client = new ServiceReference1.WSClient();

我的产品模型是这样的:

public class Product
{
    public int ProductID { get; set; }
    public string ProductName { get; set; }
    public string ProductImagePath { get; set; }
    public string Specifications { get; set; }
    public string Options { get; set; }
    public double? UnitPrice { get; set; }
    public int? CategoryId { get; set; }
    public  Category Category { get; set; }
    public int Stock { get; set; }
}

我的Category模型是这样的:

public class Category
{
    public int CategoryID { get; set; }
    public string CategoryName { get; set; }
    public string Despcription { get; set; }
    public virtual ICollection<Product> Products { get; set; }
}

我想得到这样的产品类别:

public PartialViewResult Menu()
{
    List<Product> products = client.GetAvailableProducts().ToList();

    IEnumerable<string> categories = products
                                 .Select(myproduct => myproduct.Category.CategoryName) // <- offending line
                                 .Distinct()
                                 .OrderBy(x => x);
    return PartialView(categories);
}

方法GetAvailableProducts()可以工作,因为我得到了一个产品列表,所以我知道服务正在工作。然而,当运行应用程序时,我在Linq查询中得到一个空引用异常(参见上面的违规行)。

在我看来,类别必须实例化,但然后,如何构建LINQ查询,使类别也实例化?有人能指出怎么做吗?

BR,

Gabriel

创建一个LINQ查询,从两个实体中获取数据

当你序列化服务中的产品时,你应该使用LoadWith来序列化任何链接的实体。这是因为默认值是延迟加载, EF在访问之前不会加载链接的实体。序列化产品时,不访问类别LoadWith将执行急切加载,以便将所有数据序列化。

的例子:

public IEnumerable<Product> GetAvailableProducts()
{
  var ctx = new ProductsContext();
  DataLoadOptions dlo = new DataLoadOptions();
  dlo.LoadWith<Product>(p => p.Category);
  ctx.LoadOptions = dlo;
  return ctx.Products.ToList();
}
编辑:

我猜现在下午太晚了。(

LoadWithLinq to SQL结合使用。
对于Entity Framework,您应该使用Include来代替:

public IEnumerable<Product> GetAvailableProducts()
{
  var ctx = new ProductsContext();
  return ctx.Products.Include("Category").ToList();
}

免责声明:代码不是测试

您正在成功下拉产品,但您的服务没有下拉相关类别。

因此,当您执行myproduct.Category.CategoryName时,Category总是null

您需要告诉服务返回相关的类别

看起来您的关系是0或1,因为CategoryId是int?如果Category为空,则不能执行Category. categoryname。这是一个空引用

在您的冒犯行,myproduct。类别中,有一个或多个空类别。你需要修改

client.GetAvailableProducts().ToList();

还可以下拉每个产品组成的类别。

您还应该注意不可避免的null Category

相关文章: