簡體   English   中英

將兩個LINQ語句合並為一個

[英]Combining two LINQ statments into one

嗨,我有一些要運行的LINQ代碼,但條件取決於我傳遞給函數的國家/地區變量是否為null。

因此,如果國家/地區變量為null,我想運行:-

  var resorts = from r in db.WRESORT
                      where new[] { "AUSTRIA", "FRANCE", "ITALY" }.Contains(r.COUNTRY)

如果國家具有價值,我想經營

  var resorts = from r in db.WRESORT where r.COUNTRY == country

問題是,是否有辦法將2條語句組合為一個?

謝謝

您可以使用檢查country是否有價值,然后使用country創建數組,否則使用預定義列表創建

var arr = string.IsNullOrEmpty(country) 
    ? new[] { "AUSTRIA", "FRANCE", "ITALY" }
    : new[] { country };

var resorts = from r in db.WRESORT where arr.Contains(r.COUNTRY);

可能是這個嗎?:

var resorts = from r in db.WRESORT 
              where (country != null && r.COUNTRY == country) ||
                    (country == null && new[] { "AUSTRIA", "FRANCE", "ITALY" }.Contains(r.COUNTRY))

如果確實必須將其作為單個查詢完成,則:

var resorts = from r in db.WRESORT
  where (
    country == null ? new[] { "AUSTRIA", "FRANCE", "ITALY" } : new[]{country})
    .Contains(r.COUNTRY);

但是為什么不呢?

var resorts = country == null
  ? from r in db.WRESORT
    where (new[] { "AUSTRIA", "FRANCE", "ITALY" }.Contains(r.COUNTRY)
  : from r in db.WRESORT where r.COUNTRY == country;

許多數據庫和其他提供程序使用一次相等性檢查( = )會比包含( IN (…) )做得更好,並且由於查詢的類型將是相同的,所以這將起作用並產生查詢相同類型的。 代碼分支發生在linq-y位之外有什么危害?

在這種情況下,您也可以閱讀更多:

IQueryable<Resort> resorts;
if(country == null)
  resorts = from r in db.WRESORT
    where (new[] { "AUSTRIA", "FRANCE", "ITALY" }.Contains(r.COUNTRY);
else
  resorts = from r in db.WRESORT where r.COUNTRY == country;

因為IQueryable的類型參數不是匿名的。 如果您使用的是.Select(r => new{r.COUNRY, r.Name})那將是不可能的。

路口:

var resorts = 
from r in db.WRESORT
where new[] { "AUSTRIA", "FRANCE", "ITALY" }.Contains(r.COUNTRY) && r.COUNTRY == country;

要么

聯盟:

var resorts = from r in db.WRESORT
                      where new[] { "AUSTRIA", "FRANCE", "ITALY" }.Contains(r.COUNTRY) || r.COUNTRY == country;

暫無
暫無

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

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