2012-07-06 130 views
2

如何從以下LINQ查詢中獲取各個值? (我想要得到DecalExpireDate,DecalExpireMonth和DecalExpireYear值)。linq如何從變量中獲取值

var previousExpirationDate = (from d in db.CT_Decals 
           where d.TankID == decal.TankID 
           && d.DecalStatus == "Approved" 
           select new 
           { 
            d.DecalExpireDate, 
            d.DecalExpireMonth, 
            d.DecalExpireYear 
           }).Max(d => d.DecalExpireDate); 
+1

第一要素你已經訪問'DecalExpireDate',不是嗎? – 2012-07-06 21:32:46

+0

也許我正在寫錯誤的查詢。我只是帶回DecalExpireDate,但我想要帶回所有三個值...... – user1202606 2012-07-06 21:34:49

+0

對不起,@user,我認爲'Max'會返回所有三個字段。我更新了[我的回答](http://stackoverflow.com/a/11368703/480799)。 – 2012-07-07 15:42:15

回答

7

我假設你想從最高(最後)DecalExpireDate元素得到了DecalExpireDateDecalExpireMonthDecalExpireYear。然後,你可以在此日期前訂購:

var latest = (from d in db.CT_Decals 
      where d.TankID == decal.TankID && d.DecalStatus == "Approved" 
      orderby d.DecalExpireDate descending 
      select new 
      { 
       d.DecalExpireDate, 
       d.DecalExpireMonth, 
       d.DecalExpireYear 
       }).First(); 
var decalExpireDate = latest.DecalExpireDate; 
var decalExpireMonth = latest.DecalExpireMonth; 
var decalExpireYear = latest.DecalExpireYear; 
+0

謝謝,正是我想要的。那麼,我需要做var variableName = wantedValue,來獲取單個值嗎? – user1202606 2012-07-06 21:43:10

+0

@ user1202606:您也可以編寫'DateTime decalExpireDate = latest.DecalExpireDate;'如果這真的是DateTime。但是因爲我不確定我是否使用了'var',它是實際類型的佔位符。您需要選擇一個元素來訪問變量,LINQ查詢通常會返回一個「IEnumerable 」這是一個元素序列(多個)。我將第一個元素([First()'](http://msdn.microsoft.com/zh-cn/library/system.linq.enumerable.first.aspx))排序爲**由日期變量降序***。因此它是最後一個元素。 – 2012-07-06 21:46:05

0

作出同樣的假設,蒂姆,你也可以用

var result = db.CT_Decals.OrderByDescending(d => d.DecalExpireDate).First(d => d.TankID == decal.TankID && d.DecalStatus == "Approved"); 

var expireDate = result.DecalExpireDate; 
var expireMonth = result.DecalExpireMonth; 
var expireYear = result.DecalExpireYear; 

去你將有類型的「結果」變量所需的對象「CT_Decals」所以訪問它

0
var q = from r in tab1.dictenaries 
        select new { 
         r.ENGLISH, 
         r.FRENCH 
        }; 

      List<SomeClass> sml = new List<SomeClass>(); 

      int starting = 10; 
      int ending = 20; 
      int cntr = 0; 
      foreach(var verObj in q) 
      { 
       if (cntr >= starting && cntr <= ending) 
       { 
        SomeClass sm1 = new SomeClass(); 
        sm1.ENGLISH = verObj.ENGLISH.ToString(); 
        sm1.FRENCH = verObj.FRENCH.ToString(); 
        sml.Add(sm1); 
       } 
       else if(cntr >ending) 
       { 
        break; 
       } 
       cntr = cntr + 1; 
      } 
0

添和Dipin構建財物時,First()方法不幸引發InvalidOperationException查詢的時候不會產生任何結果。

要麼你用try/catch塊

try{ 
    var latest = (from d in db.CT_Decals 
       where d.TankID == decal.TankID && d.DecalStatus == "Approved" 
       orderby d.DecalExpireDate descending 
       select new 
       { 
        d.DecalExpireDate, 
        d.DecalExpireMonth, 
        d.DecalExpireYear 
        }).First(); 
    var decalExpireDate = latest.DecalExpireDate; 
    var decalExpireMonth = latest.DecalExpireMonth; 
    var decalExpireYear = latest.DecalExpireYear; 
} 
catch(InvalidOperationException ex){ // tell no Result!} 

圍繞着它,或者你可以使用FirstOrDefault()當查詢產生不匹配,這將返回一個空引用。

//... Example from above 

}).FirstOrDefault(); 

// check for null-reference 
if(latest != null) 
    var decalExpireDate = latest.DecalExpireDate; 
    var decalExpireMonth = latest.DecalExpireMonth; 
    var decalExpireYear = latest.DecalExpireYear; 
} 

第三種可能性是採取使用Take(1)

//... Example from above 

}).Take(1).ToList(); // returns an empty list if no match 

// check whether something was returned 
if(latest.Any()) 
    var decalExpireDate = latest[0].DecalExpireDate; 
    var decalExpireMonth = latest[0].DecalExpireMonth; 
    var decalExpireYear = latest[0].DecalExpireYear; 
} 
相關問題