2009-09-25 96 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; 
}