Reputation: 3142
How to translate the flowing sql query into linq so I can use inside my web api controller.
select * from String where StringNumber in
(
select Str1 from Detail where DetailNr = 6
union
select Str2 from Detail where DetailNr = 6
union
select Str3 from Detail where DetailNr = 6
union
select Str4 from Detail where DetailNr = 6
)
I have tried to select the individual string numbers and I came up with this:
var str1 = _dataContext.Context.Detail.AsQueryable()
.Where(n => n.DetailNr == 6)
.Select(n => n.Str1 );
var str2 = _dataContext.Context.Detail.AsQueryable()
.Where(n => n.DetailNr == 6)
.Select(n => n.Str2 );
var str3 = _dataContext.Context.Detail.AsQueryable()
.Where(n => n.DetailNr == 6)
.Select(n => n.Str3 );
var str4 = _dataContext.Context.Detail.AsQueryable()
.Where(n => n.DetailNr == 6)
.Select(n => n.Str4 );
then something like this:
var result= _dataContext.Context.String.AsQueryable()
.Where(s => s.StringNumber == str1 or str2 or str2 or str4).ToList();
How should this be written in an asp.net MVC controller? Maybe use a SelectMany clause?
Upvotes: 0
Views: 217
Reputation: 152521
This will work for Linq to Objects, but may not be supported by Linq to Entities:
var strings = _dataContext.Context.Detail.AsQueryable()
.Where(n => n.DetailNr == 6)
.Select(n => new [] {n.Str1, n.Str2, n.Str3, n.Str4});
.SelectMany(s => s);
var result= _dataContext.Context.String.AsQueryable()
.Where(s => strings.Contains(s)).ToList();
You may need to add as AsEnumerable
to hyrdate the list.
Upvotes: 2
Reputation: 44268
var results = _dataContext.Context.Detail.Where (n => n.DetailNr == 6).ToList();
var concattedResults = results.Select(n => n.Str1)
.Concat(results.Select(n => n.Str2))
.Concat(results.Select(n => n.Str3))
.Concat(results.Select(n => n.Str4)).ToList();
Upvotes: 0