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));
假设 Id
是 sp.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();
我正在尝试使用 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));
假设 Id
是 sp.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();