2009-09-25 98 views
0

我想在此查詢中返回實際值,但我只獲取表達式。請有人指點我正確的方向。理解LINQ返回值的問題

public static String NurseName(Guid? userID) 
    { 
     var nurseName = from demographic in context.tblDemographics 
         where demographic.UserID == userID 
         select new {FullName = demographic.FirstName +" " + demographic.LastName}; 

     String nurseFullName = nurseName.ToString(); 

     return nurseFullName; 
    } 

nurseFullName作爲結束 - >SELECT ([t0].[FirstName] + @p1) + [t0].[LastName] AS [FullName] FROM [dbo].[tblDemographics] AS [t0] WHERE ([t0].[UserID]) = @p0

+1

請記住,查詢表達式的值是一個表示查詢*的對象。該對象具有很好的屬性,當你讓它枚舉它時,它會運行查詢。但是對象本身不是*結果*,它是*查詢*。 – 2009-09-25 19:40:11

+0

@Eric:謝謝。這有助於我理解它。 – 2009-09-25 19:55:49

回答

3
public static String NurseName(Guid? userID) 
    { 
     var nurseName = from demographic in context.tblDemographics 
         where demographic.UserID == userID 
         select demographic.FirstName +" " + demographic.LastName; 

     return nurseName.SingleOrDefault(); 
    } 

在上面的nurseName中有IQueryable表達式,所以它沒有執行任何操作。當你枚舉它的時候,查詢被調用。當您調用SingleOrDefault等方法時也是如此。


如果你使用你原來的查詢表達式相反,你可以:單間

public static String NurseName(Guid? userID) 
    { 
     var query= from demographic in context.tblDemographics 
         where demographic.UserID == userID 
         select new {FullName = demographic.FirstName +" " + demographic.LastName; } 
     var nurseName = query.SingleOrDefault(); 
     return nurseName != null ? nurseName.FullName : ""; 
    } 

差異對比的SingleOrDefault是,後來讓一個空的結果。 First與Single之間的區別在於後者可以防止超過1行。

+0

說'不能將表達式類型{FullName:String}轉換爲返回類型String' ... – 2009-09-25 17:58:55

+0

@Refracted聖騎士,請注意我改變了查詢表達式。 – eglasius 2009-09-25 17:59:35

+0

SingleOrDefault返回的類型取決於您在select中聲明的內容,在您的版本中它將是一個具有屬性FullName的匿名類型 - 在我的版本中它將直接是字符串。 – eglasius 2009-09-25 18:02:22

3

試試這個:

var nurseName = (from demographic in context.tblDemographics 
       where demographic.UserID == userID 
       select new {FullName = demographic.FirstName +" " + demographic.LastName}).First().FullName; 

你的代碼被抓的集合,而不是一個具體項目。此修改採用列表中的第一項並返回FullName屬性。

+1

請注意。如果找不到該項目,則首先會拋出異常,您可能需要這樣做,這樣意外的事情不會保持沉默。 First和Single之間的區別在於,如果多於一行的話,後者會拋出異常,這也是您可能需要的,以至於意外(可能是因爲查詢出錯,或者出現了錯誤數據)不會保持沉默。 – eglasius 2009-09-25 18:07:36

1
public static String NurseName(Guid? userID) 
{ 
    var nurseName = (from demographic in context.tblDemographics 
        where demographic.UserID == userID 
        select new {FullName = demographic.FirstName +" " + demographic.LastName}).SingleOrDefault(); 

    if(null == nurseName) 
    { 
     //TODO: Uh-Oh ID not found... 
    } 

    string nurseFullName = nurseName.FullName; 

    return nurseFullName; 
}