【发布时间】: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 中的搜索字段。