C# 通过条件列表选择实体
标题有点复杂,我无法用一句话概括我想要完成的事情。考虑到以下edmx:C# 通过条件列表选择实体,c#,entity-framework,C#,Entity Framework,标题有点复杂,我无法用一句话概括我想要完成的事情。考虑到以下edmx: 我如何选择拥有一个所有者ID的RegisteredVehicle的所有停车请求 1车主可以有许多车辆,因此我需要检索单个个人拥有的任何车辆发出的所有停车请求。我现在有 var entity = await context.AspNetUsers.Include(P => P.RegisteredVehicles .Select(A => A.MakeSource
我如何选择拥有一个所有者ID的RegisteredVehicle的所有停车请求 1车主可以有许多车辆,因此我需要检索单个个人拥有的任何车辆发出的所有停车请求。我现在有
var entity = await context.AspNetUsers.Include(P => P.RegisteredVehicles
.Select(A => A.MakeSource)).Include(P => P.RegisteredVehicles
.Select(B => B.ModelSource)).Include(P => P.RegisteredVehicles
.Select(C => C.YearSource))
.Include(F => F.ParkingRequests)
.SingleOrDefaultAsync(G => G.Id == id);
此查询基本上是选择一个用户实体,其中包含其各自注册的所有车辆以及车辆的元信息,如品牌名称、型号名称、年份、颜色等。然后在最后,我尝试包括属于此用户的所有停车请求,但我得到了所有用户的所有请求。我想这是因为我的parking requests表中没有userId nav属性,而是试图检索单个userId拥有的所有车辆的数据
ps我还尝试了
.Include(F=>F.ParkingRequests.Select(D=>D.RegisteredVehicle.OwnerId==id))
,但也遇到了错误,说明我需要正确使用导航属性。我假设这是因为我在单个实体“registeredvehicle”上使用了Select,而不是在集合上使用了Select。使用linq查询表达式要容易得多。最后,我将原始查询一分为二,使用以下linq表达式获取与单个个人的注册车辆相关的所有停车请求
var vehIds = entity.RegisteredVehicles.Select(P => P.Id).ToList();
var requests = from request in context.ParkingRequests
where vehIds.Contains(request.RegisteredVehicleId)
select request;
var orderedRequests = requests.OrderByDescending(P => P.DateAndTime).ToList();
让我为您提供一个更快的解决方案:
var ownerId = 1;
var query =
from request in context.ParkingRequests
join vehicle in context.Vehicles on request.RegisteredVehicleId equals vehicle.Id
where vehicle.ownerId == ownerId
select request;
投票被否决有两个原因。解决方案不起作用,使用linq查询表达式也不容易。@RobertMcKee它怎么不起作用?你想让我给我的屏幕录像,这样你就可以看到结果了吗?第二个原因是观点。我是原始帖子的作者,所以我加入了我的观点。使用linq表达式似乎更容易,因为我可以访问对象
request
本身。这确实有效,所以我认为没有必要进行向下投票,但感谢您至少提供了反馈,而不是鬼影向下投票。我看不出您的查询表达式比说更简单var requests=context.ParkingRequests.Where(r=>vehIds.Contains(r.RegisteredVehicleId))代码>根据其不起作用的原因,您正在选择每一辆注册车辆,而不管用户是谁,这不是您的OP所要求的。如果你愿意,我可以在测试数据上发布一段视频。