C# EF 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))

我正在使用服务获取一组项目。我想为结果中的每个项目计算与地理坐标的距离,但我不知道如何使用lambda将其添加到现有服务查询中

这就是我获取数据的方式:

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
with
Include(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
已经包含在项目中,您为什么还要关心它?