2016-04-19 15 views
1

Ich versuche, eine vorhandene sql gespeicherte proc in Linq zu konvertieren. Der gespeicherte Prozess verwendet coalesce(), während er die where-Klausel aufbaut.C# linq sql Coalesce-Konvertierung

Unten ist, was ich versucht habe.

Können einige Ratschläge/andere auf die richtige Art und Weise geben, diese Umwandlung zu nähern?

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

} 
+0

Das „dynamische“ SQL gibt mir die Angst. – spender

+0

Es ist nicht klar, wie 'aDateMin' möglicherweise nicht null ist. – spender

+0

Deshalb muss ich es konvertieren. Der aDateMin-Wert wird aus dem Suchfeld in der Benutzeroberfläche kommen. – ironman

Antwort

1

Ich habe es nicht ausprobiert, aber Sie so etwas wie versuchen könnte:

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

süß. das scheint zu funktionieren – ironman

1

für mich mit der ?? (C# Äquivalent COALESCE) könnte den Trick tun:

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

Oder eine andere Formulierung:

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