C# 通过linq显示数据
我想显示特定等级的食品信息C# 通过linq显示数据,c#,entity-framework,linq,C#,Entity Framework,Linq,我想显示特定等级的食品信息 List<Rating> rates = db.Ratings.OrderByDescending(e => e.Rate).ToList(); int i = 0; foreach(Rating rate in rates) { rates[i].Food = db.Foods.Where(e => e.ID == rate.FID).FirstOrDefault(); i++; } r
List<Rating> rates = db.Ratings.OrderByDescending(e => e.Rate).ToList();
int i = 0;
foreach(Rating rate in rates)
{
rates[i].Food = db.Foods.Where(e => e.ID == rate.FID).FirstOrDefault();
i++;
}
return Request.HttpCreateResponse(rates);
我想要这样
{
"ID": 65,
"Name": "Grilled chicken",
"Price": "580",
"CatID": 75,
"UID": 101,
"Date_Time": "2019-04-01T00:00:00",
"FoodDescription": "Chicken with some oregeno",
"CookingTime": "25 min",
"Image": "",
"Uploadedby": "Hanzala Iqbal",
"Carts": [],
"Category": null,
"User": null,
"FoodRecommendations": [],
"OrderFoods": [],
"Ratings": []
},
我希望你能提前理解我想要实现的目标。基于费率[I]。食物=。。。您的评级实体已经与食品建立了关系。您的代码正在执行一些不必要的操作:
选择N+1:通过迭代已经检索到的评级,您将再次访问DB,以获取每个评级的食物。这意味着一次一个查询读取200个评级,一次200个查询读取食品的1个评级。
当您不想更新实体时设置实体引用:这是一种不好的做法,因为如果该DbContext范围内的后续代码调用SaveChanges,则会出现FK错误或您不希望更新的数据。
返回实体,而错误的实体:你不想返回评级,你想返回食物。您还应该避免从调用中返回实体对象,因为这通常包含太多关于模式的信息,并且您永远不应该从客户机代码中接受实体来执行诸如附加到上下文和保存更改之类的操作。它感觉很方便,意味着更少的编码,但会使您的系统暴露于各种意外/非预期的更新中。
为了得到您想要的,您只需要利用评级和食物之间的关系,将相关数据选择到ViewModel中,然后返回ViewModel
视图模型:
[Serializable]
public class FoodViewModel
{
public int ID {get; set}
public string Name {get; set}
public decimal Price {get; set}
public DateTime Date_Time" {get; set}
public string FoodDescription {get; set}
public string CookingTime {get; set}
public string Uploadedby {get; set}
}
如果您确实需要返回详细信息、购物车、食品推荐等的集合,请为这些集合定义视图模型。一般来说,只需返回视图/消费者所需的数据
要通过降低等级选择食物:
var foodViewModels = db.Ratings.OrderByDescending(e => e.Rate)
.Select(e => new FoodViewModel
{
ID = e.Food.ID,
Name = e.Food.Name,
Price = e.Food.Price,
DateTime Date_Time = e.Food.Date_Time,
FoodDescription = e.Food.FoodDescription,
CookingTime = e.Food.CookingTime,
UploadedBy = e.Food.UploadedBy
}).Distinct().ToList();
return Request.HttpCreateResponse(foodViewModels);
作为猜测,食物和评级之间的关系看起来像是多对一的关系,其中每种食物可能有多个评级,因此您可能需要将结果限制为仅按其最大评级列出食物。在.ToList之前,A.Distinct可能已经足够了,或者从db.Foods和orderby.Maxf=>Rating.Rate中选择
即:
上面的代码没有显示部分,也没有将数据显示为json的部分。请展示为您提供jsonAlso的代码,您正在使用EF-为什么要执行这么多单独的linq查询。使用joins或更好的方法仍然可以设置导航属性并使用IncludeI我不确定我是否完全理解您的问题,但可能是费率。选择e=>e.Food.ToList在您的foreach之后列出您所需要的全部内容
var foodViewModels = db.Ratings.OrderByDescending(e => e.Rate)
.Select(e => new FoodViewModel
{
ID = e.Food.ID,
Name = e.Food.Name,
Price = e.Food.Price,
DateTime Date_Time = e.Food.Date_Time,
FoodDescription = e.Food.FoodDescription,
CookingTime = e.Food.CookingTime,
UploadedBy = e.Food.UploadedBy
}).Distinct().ToList();
return Request.HttpCreateResponse(foodViewModels);
var foodViewModels = db.Foods.OrderByDescending(f => f.Ratings.Max(r => r.Rate))
.Select(f => new FoodViewModel
{
ID = f.ID,
Name = f.Name,
Price = f.Price,
DateTime Date_Time = f.Date_Time,
FoodDescription = f.FoodDescription,
CookingTime = f.CookingTime,
UploadedBy = f.UploadedBy
}).ToList();