gpt4 book ai didi

c# - 创建从两个实体获取数据的 LINQ 查询

转载 作者:太空宇宙 更新时间:2023-11-03 18:30:02 26 4
gpt4 key购买 nike

我想获取 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,

加布里埃尔

最佳答案

当您序列化服务中的产品时,您应该使用LoadWith还序列化任何链接的实体。这是因为默认情况下是延迟加载,并且 EF 在访问之前不会加载链接的实体。当您序列化 Products 时,不会访问 CategoryLoadWith 将执行预先加载,以便序列化所有数据。

例子:

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();
}

免责声明:代码未经测试

关于c# - 创建从两个实体获取数据的 LINQ 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24143118/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com