创建一个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
当你序列化服务中的产品时,你应该使用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();
}
编辑:
我猜现在下午太晚了。(
LoadWith
与Linq 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