LINQ 查询将 Id 与 SingleOrDefault 查询中的列表中的 Id 进行比较

LINQ Query comparing Id with an Id in a list inside SingleOrDefault query

我正在尝试使用 SingleOrDefault Linq to SQL 方法获取一个选项。

 var po = repository.Context.AsQueryable<Option>().SingleOrDefault(o => o.Option.Id == sp.Options // sp.Options is a collection);

问题是我在 SingleOrDefault 方法中比较 p.Option.Id == 一个集合。我想要的是 select sp.Options 中匹配 o.Option.Id 的选项。我该怎么做?

更新: 我应该提到的一件事是 sp.Options 与选项 class 不同 class。 sp.Options 是 SPOptions class 所以我不能在 contains 方法中传递它。

使用 Contains (sp.Options.Contains(o.Option.Id)) 进行搜索,例如:

var po = repository.Context.AsQueryable<Option>()
                    .SingleOrDefault(o => sp.Options.Contains(o.Option.Id));

如果 sp.Options 的成员与 Id 的成员不同,那么您可以这样做:

var po = repository.Context.AsQueryable<Option>()
                    .SingleOrDefault(o => sp.Options.Any(r=> r.Id == o.Option.Id));

var po = repository.Context.AsQueryable<Option>()
                    .SingleOrDefault(o => sp.Options.Select(r=> r.Id).Contains(o.Option.Id));

假设 Idsp.Options 元素中要与之比较的字段。

看看Contains

repository.Context.AsQueryable<Option>().SingleOrDefault(o => sp.Options.Contains(o.Option.Id));

如果 Options 不是 class 或 Option.Id 的集合,您可以使用 Any 方法和您的比较逻辑,如下所示:

repository.Context.AsQueryable<Option>().SingleOrDefault(o => sp.Options.Any(opts => opts.Something == o.Option.Id));

根据您的问题,您似乎希望这两个选项集之间只有一个匹配项,对吗? 如果是这样,我建议您将其写为:

var po = repository.Context.AsQueryable().Where(o => sp.Options.Any(item=>item.id == o.Option.Id)).SingleOrDefault();