【问题标题】:c# linq sql coalesce conversion时间:2019-05-10 标签:c#linqsqlcoalesce转换
【发布时间】:2016-04-19 15:23:12
【问题描述】:

我正在尝试将现有的 sql 存储过程转换为使用 linq。存储过程在构建“where”子句时使用了 coalesce()。

以下是我尝试过的。

有人可以就处理这种转换的正确方法提供建议吗?

------- sql

    if @a is not null 
        set @WhereClause = @WhereClause + ' and v.a_number = ''' + @a + ''''


    if @b is not null 
        set @WhereClause = @WhereClause + ' and v.b_number = ''' + @b + ''''


    if @aDateMin is not null 
        set @WhereClause = @WhereClause + ' and coalesce(v.a_end_dt, v.a_start_dt, ''1/1/1753'') 
            >= ''' + convert(varchar(10), @aDateMin, 101) + ''''


    if @aDateMax is not null 
        set @WhereClause = @WhereClause + ' and coalesce(v.a_start_dt, v.a_end_dt, ''12/31/9999'') 
            <= ''' + convert(varchar(10), @aDateMax, 101) + ''''

set @Sql =      from Results v
                @WhereClause ;';

--print @Sql
exec sp_executesql @Sql

-----linq

var aNumber = "";
var bNumber = "";
DateTime? aDateMin = null;
DateTime? aDateMax = null;

var query =     from v in searchResults
                select v;

if(!String.IsNullOrEmpty(aNumber )){
    query = query.Where(v => v.a_number == aNumber);
}

if(!String.IsNullOrEmpty(bNumber)){
    query = query.Where(v => v.b_number == bNumber);
}


//  this is where I'm having issue with the conversion.
if(aDateMin.HasValue){

    query = query.Where(v => 
                        v.a_end_dt.HasValue ? v.a_end_dt >= aDateMin : v.a_start_dt.HasValue ? v.a_start_dt <= aDateMin : "1/1/1753");

}

【问题讨论】:

  • 那个“动态”的 sql 让我害怕。
  • 不清楚aDateMin 怎么可能是非空的。
  • 这就是我需要转换它的原因。 aDateMin 值将来自 UI 中的搜索字段。

标签: c# sql linq lambda


【解决方案1】:

我没试过,但你能试试吗:

var dt = new DateTime(1753, 1,1);
query = query.Where(v =>  (v.a_end_dt ?? v.a_start_dt ?? dt) >= aDateMin);

【讨论】:

    【解决方案2】:

    对我来说,使用 ??(c# 等效于 COALESCE)可能会成功:

    if(aDateMin.HasValue){
        query = query.Where(v => 
                            aDateMin.Value < v.a_end_dt ?? v.a_start_dt ?? new DateTime(1753, 1, 1));
    

    或另一种表述:

    query = query.Where(v => 
                            aDateMin.HasValue.Value < v.a_end_dt ?? v.a_start_dt ?? new DateTime(1753, 1, 1));
    

    【讨论】:

      猜你喜欢
      • 2020-06-15
      • 2020-10-01
      • 2015-06-14
      • 2011-07-08
      • 2012-02-03
      • 2017-04-15
      • 2021-07-31
      • 2016-01-27
      • 1970-01-01
      相关资源
      最近更新 更多