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

时间:2015-06-30 17:48:24

标签: c# linq

我正在尝试使用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 ==一个集合。我想要的是从与o.Option.Id匹配的sp.Options中选择选项。我怎么能这样做?

更新: 有一件事我应该提到sp.Options是一个与Option类不同的类。 sp.Options是SPOptions类,所以我无法在contains方法中传递它。

3 个答案:

答案 0 :(得分:4)

使用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元素中的字段。

答案 1 :(得分:4)

看看Contains

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

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

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

答案 2 :(得分:0)

基于你的问题,似乎你期望这两个选项集之间只有一个匹配,对吗? 如果是这样,我建议你把它写成:

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