gpt4 book ai didi

entity-framework - 将存储过程结果映射到 Entity Framework 5 中的实体

转载 作者:行者123 更新时间:2023-12-03 23:38:34 25 4
gpt4 key购买 nike

我在将通过存储过程查询的搜索结果映射到我的 EF 实体时遇到了一些麻烦。我正在使用数据库优先方法。

我可以轻松使用 DbContext.Database.SqlQuery<T>要检索简单的实体,只要我的存储过程返回适当的列名,这就没有问题。然而,我的问题是我需要将相关实体与搜索结果一起加载。

这就是我正在使用的:

// Product.cs
public class Product
{
public int ProductId { get; set; }
public int CategoryId { get; set; }
public int BrandId { get; set; }

public virtual Category Category { get; set; }
public virtual Brand Brand { get; set; }
}

// Category.cs
public class Category {
public int CategoryId { get; set; }
...
more properties
}

// Brand.cs
public class Brand {
public int BrandId { get; set; }
...
more properties
}

DbSet<Product> 中提取数据时一切正常,导航属性按预期延迟加载。

是否有办法从存储过程中提取所有需要的数据,以便正确填充我的相关实体(即,我是否需要以某种特定方式命名我的列)?

我还尝试了第二种方法,我只是简单地拉一个 List<int>ProductId从存储过程中提取实体,然后使用 Linq 查询再次访问数据库以提取实体。

List<int> results = unitOfWork.SqlQuery<int>(
@"EXECUTE dbo.SomeStoredProcedure @Keyword",
new SqlParameter("Keyword", keyword)
).ToList();

List<Product> products = unitOfWork.ProductRepository.Get(
filter: q => results.Contains(q.ProductId)
).ToList();

这种方法会产生两个问题:两次访问数据库和某处顺序丢失。我可以忍受的第一个问题,这是一个低流量的应用程序,我不担心额外的数据库访问。

第二个是一个更大的问题。根据存储过程中的某些搜索值排名,在初始查询中以正确的顺序提取结果。然后,该订单在第二个查询中丢失,给我留下一个随机排序的结果集,并且(我可以看到)无法将其排序。

有什么想法吗?

最佳答案

我无法让 .edmx 映射正常工作,所以我最终坚持使用第二种方法并使用一种非常 hackish 的方式让我的结果按应有的方式排序。

我使用原始问题中提到的两个查询提取我的实体(第一个列表的顺序正确):

List<int> results = unitOfWork.SqlQuery<int>(
@"EXECUTE dbo.SomeStoredProcedure @Keyword",
new SqlParameter("Keyword", keyword)
).ToList();

List<Product> products = unitOfWork.ProductRepository.Get(
filter: q => results.Contains(q.ProductId)
).ToList();

我使用 View 模型将两个列表传递到我的 View 中:

public class SearchViewModel : BaseViewModel
{
public SearchViewModel()
{
this.Results = new List<int>();
this.Products = new List<Product>();
}

public string Keyword { get; set; }
public List<int> Results { get; set; }
public List<Product> Products { get; set; }
}

然后在 View 级别而不是循环 List<Product> ,我遍历结果列表。

<ul class="products medium">
@foreach(int productId in Model.Results){
var product = Model.Products.FirstOrDefault(p => p.ProductId == productId);
<li>
...
display content
</li>
}
</ul>

感觉肮脏和骇人听闻,但现在必须这样做。也许当我找到不需要使用 .edmx 文件的更好解决方案时,我会再回来使用它。

关于entity-framework - 将存储过程结果映射到 Entity Framework 5 中的实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17867575/

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