【问题标题】:SQL to LINQ conversion for asp.net IQueryableasp.net IQueryable 的 SQL 到 LINQ 转换
【发布时间】:2013-10-03 18:56:39
【问题描述】:

如何将流动的 sql 查询转换为 linq,以便我可以在我的 web api 控制器中使用。

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 子句?

【问题讨论】:

    标签: sql asp.net-mvc linq sql-to-linq-conversion


    【解决方案1】:

    这适用于 Linq to Objects,但 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();
    

    您可能需要添加为 AsEnumerable 以添加列表。

    【讨论】:

    • 我只需要用 contains(s.propety) 更改 contains(s)。谢谢!
    【解决方案2】:
    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();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-23
      • 2011-03-11
      • 2018-03-15
      • 1970-01-01
      • 2019-05-29
      • 2015-07-12
      • 2012-08-12
      • 1970-01-01
      相关资源
      最近更新 更多