簡體   English   中英

C#,如果否則然后用LINQ語句

[英]c# if else then statement with LINQ

我有以下代碼:

if (intval == 0)
{
    var result = (from dm in datacontext.Trk
                  where dm.ID == 0
                  select dm);
}
else
{
   var result = (from dm in datacontext.Trk
                 where dm.ID != 0
                 select dm);
}

if (result != null)
{
    // do something
}

if (result!= null)的結果下面有一條斜線,表明名稱結果在當前上下文中不存在。

不確定如何解決此問題。 我最初嘗試var result = null但是C#不喜歡這樣。

該變量僅限於在其中聲明的塊。因此,您有兩個result s,一個in if塊和一個in else塊,它們是不同的,並且在其塊外不可見。

您需要在塊外定義變量,但是隨后需要具體說明類型,因為C#編譯器需要直接賦值表達式來推斷var關鍵字的類型。

但是,我建議重新考慮您的代碼,然后執行以下操作:

var result = from dm in datacontext.Trk
             where ((intval == 0) ? dm.ID == 0 : dm.ID != 0)
             select dm;

if (result.Any())
{
   // do something
}

另請注意, result永遠不會為null ,因此,我相信我已將其替換為Any但我認為這不是問題的要旨。

您需要在if語句之前聲明result

object result = null;

if (intval = 0)
{
   result = (from dm in datacontext.Trk
                 where dm.ID = 0
                 select dm);

}
else
{
   result = (from dm in datacontext.Trk
                 where dm.ID != 0
                 select dm);


 }

 if (result != null)
 {

  // do something

 }

或者,您可以將var聲明保留在另一個變體中:

var result = (from dm in datacontext.Trk
                 where dm.ID != 0
                 select dm);

if (intval = 0)
{
   result = (from dm in datacontext.Trk
                 where dm.ID = 0
                 select dm);

}

if (result != null)
{
   // do something

}

現在,您應該以某種方式找到一種方法來更改if或將其完全刪除,因為在那個時候result不能為null

這樣的事情怎么樣:

    var result = 
        intval == 0 
            ?(from dm in datacontext.Trk where dm.ID = 0 select dm) 
            :(from dm in datacontext.Trk where dm.ID != 0 select dm);

    if(results.Any())
    {
        ...
    }

您可以與主查詢分開執行where:

var result = from dm in datacontext.Trk select dm;
if (intval == 0)
{
    result = result.Where(dm => dm.ID == 0);
}
else
{
    result = result.Where(dm => dm.ID != 0);
}

if (result.Any())
{
    // do something
}

您需要在第一個if-else之前聲明結果變量。

另外,您還需要在第二個if語句中圍繞條件進行套疊。

此代碼也將導致問題:

if (value == 0)
{
     int result = 1;
}
else
{
     string result = "testing";
}

if (result != 1)
{
     // do something
} 

第一次結果是一個int ,第二次是我聲明一個string ,而第三次是未聲明的result 它們可以具有不同類型的原因是因為前兩個聲明屬於不同的作用域。 每個{ ... }都有自己的范圍。

如果要在范圍之間共享一個變量,則需要在外部聲明它。 但是現在,由於在所有三個地方都使用了相同的變量,因此存在類型不匹配的編譯器錯誤:

int result;

if (value == 0)
{
    result = 1;
}
else
{
    result = "testing"; // type error here
}

if (result != 1)
{
     // do something
} 
List<TypeOfDm> dmList; // <=== Declare dmList outside of block statements.
if (intval == 0) { // <=== Use "==" for comparision, "=" is assignement.
    dmList = datacontext.Trk
        .Where(dm =>  dm.ID == 0)
        .ToList();
} else { 
    dmList = datacontext.Trk
        .Where(dm =>  dm.ID != 0)
        .ToList();
} 
if (dmList.Count != 0) { 
  // do something 
} 

注意,使用您的代碼,結果將始終為非空。

暫無
暫無

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

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