2012-07-06 132 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; 
} 
相关问题