簡體   English   中英

C#LINQ SQL合並轉換

[英]c# linq sql coalesce conversion

我正在嘗試將現有的sql存儲過程轉換為使用linq。 存儲的proc在建立“ 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");

}

對我來說,使用?? (相當於COALESCE c#)可能會解決問題:

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

我沒有嘗試過,但是您可以嘗試以下操作:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM