C# EF Lambda查询-每个项目的计算?
我正在使用服务获取一组项目。我想为结果中的每个项目计算与地理坐标的距离,但我不知道如何使用lambda将其添加到现有服务查询中 这就是我获取数据的方式:C# EF Lambda查询-每个项目的计算?,c#,entity-framework,linq,lambda,C#,Entity Framework,Linq,Lambda,我正在使用服务获取一组项目。我想为结果中的每个项目计算与地理坐标的距离,但我不知道如何使用lambda将其添加到现有服务查询中 这就是我获取数据的方式: IEnumerable<Listing> items = await _listingService.Query(x => x.CategoryID == model.CategoryID || keys.Any(c => c == x.CategoryID))
IEnumerable<Listing> items = await _listingService.Query(x => x.CategoryID
== model.CategoryID || keys.Any(c => c == x.CategoryID))
.Include(x => x.ListingPictures)
.Include(x => x.Category)
.SelectAsync();
这不起作用,因为它会丢失第一个查询中Include()
语句中的所有关系。在第一个服务lambda查询中,我不知道如何使用像这样的let
关键字来做同样的事情。我尽量不去问两次。是否有方法计算第一个服务查询lambda中的字段,以便将距离添加到每个项目
我认为使用linq可能会起作用,但我无法做到。我认为在这种情况下使用linq会使您的声明不那么可读,但下面是您的操作方法:
List<Listing> items1 = items.Select(g => select new Listing()
{
ID = g.ID,
CategoryID = g.CategoryID,
Title = g.Title,
Description = g.Description,
Price = g.Price,
Location = g.Location,
Created = g.Created,
DistanceInMiles = (g.Geolocation.Distance(point) / 1609.344),
});
List items1=items.Select(g=>selectnewlisting()
{
ID=g.ID,
CategoryID=g.CategoryID,
标题=g.标题,
描述=g.描述,
价格=g.价格,
位置=g.位置,
已创建=g.已创建,
距离英里=(g.地理位置距离(点)/1609.344),
});
我认为在这种情况下使用linq会降低您的语句的可读性,但下面是如何做到这一点的:
List<Listing> items1 = items.Select(g => select new Listing()
{
ID = g.ID,
CategoryID = g.CategoryID,
Title = g.Title,
Description = g.Description,
Price = g.Price,
Location = g.Location,
Created = g.Created,
DistanceInMiles = (g.Geolocation.Distance(point) / 1609.344),
});
List items1=items.Select(g=>selectnewlisting()
{
ID=g.ID,
CategoryID=g.CategoryID,
标题=g.标题,
描述=g.描述,
价格=g.价格,
位置=g.位置,
已创建=g.已创建,
距离英里=(g.地理位置距离(点)/1609.344),
});
项目1
是一组全新的列表
对象,您不能“更新”现有对象的值。因此,由于不复制列表图片
和类别
属性,因此它们将为空。您需要在投影中执行以下操作:
select new Listing()
{
ID = g.ID,
CategoryID = g.CategoryID,
Title = g.Title,
Description = g.Description,
Price = g.Price,
Location = g.Location,
Created = g.Created,
DistanceInMiles = (distance / 1609.344),
ListingPictures = g.ListingPictures, //Add this line
Category = g.Category //and this line
});
或者,看起来您只是在尝试更新
DistanceInMiles
属性,使用简单的foreach
循环可能会更好。items1
是一组全新的列表
对象,您不是在“更新”现有对象的值。因此,由于不复制列表图片
和类别
属性,因此它们将为空。您需要在投影中执行以下操作:
select new Listing()
{
ID = g.ID,
CategoryID = g.CategoryID,
Title = g.Title,
Description = g.Description,
Price = g.Price,
Location = g.Location,
Created = g.Created,
DistanceInMiles = (distance / 1609.344),
ListingPictures = g.ListingPictures, //Add this line
Category = g.Category //and this line
});
或者,看起来您只是在尝试更新
DistanceInMiles
属性,使用一个简单的foreach
循环可能会更好。它无法“丢失”Include,当我使用\u列表服务时,@DavidG(x=>x.ListingPictures)
例如,项目
集合中的每个项目都包含列表图片
(计数>0)。在我使用let子句和select new projection
运行第二个linq查询后,每个项上的ListingPictures
都是空的。这似乎是有意义的,因为selecte new
projection正在创建一个Listing
对象,但没有为每个列表创建相关实体。我将很可能必须在我的linq语句中使用联接,或者在select new中使用某种嵌套来保留相关的属性集合。它不可能“丢失”包含项,你怎么会认为会发生这种情况呢?@DavidG当我使用\u listingService.Query
withInclude(x=>x.ListingPictures)
例如,项目
集合中的每个项目都包含列表图片
(计数>0)。在我使用let子句和select new projection
运行第二个linq查询后,每个项上的ListingPictures
都是空的。这似乎是有意义的,因为selecte new
projection正在创建一个Listing
对象,但没有为每个列表创建相关实体。我将很可能必须在我的linq语句中使用联接,或者在select new中使用某种嵌套来保留相关的属性集合。看起来与我正在使用的linq语句类似,但没有解决关系问题。如何在使用时填充列表图片
。Include(x=>x.ListingPictures)
?这两个查询都是Linq查询,您的查询语法称为查询语法,我的查询语法称为lambda语法。ListingPictures
已经包含在条目中,您为什么还要再次关注它?看起来与我已经使用的Linq语句类似,但没有解决关系问题。如何填充ListingPictures
使用.Include(x=>x.ListingPictures)
完成?两个查询都是Linq查询,您的查询语法称为查询语法,我的查询语法称为lambda语法。ListingPictures
已经包含在项目中,您为什么还要关心它?