2013-09-27 86 views
0

如何將流動的sql查詢轉換爲linq,以便我可以在我的web api控制器中使用。SQL to LINQ轉換爲asp.net IQueryable

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 
) 

我試圖選擇單個串號,我想出了這個:

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); 

則是這樣的:

var result= _dataContext.Context.String.AsQueryable() 
    .Where(s => s.StringNumber == str1 or str2 or str2 or str4).ToList(); 

如何把這個寫在一個asp .net MVC控制器? 也許使用SelectMany子句?

回答

2

這對LINQ工作對象,但可能不會通過LINQ到實體的支持:

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(); 

您可能需要添加爲AsEnumerable到hyrdate列表。

+0

我只是不得不改變包含(s.propriety)的包含。謝謝! – razvanz

0
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();