BattlFrog
BattlFrog

Reputation: 3397

LINQ to Entities - How to return a single string value from entity

I am working in asp mvc 3 app. I have a model/entity called History. I have a linq query that returns one value. Depending on what I do, I either get a "Object not set to an instance" error in the controller when the method is called, or I get a "cannot implicitly convert from string to type Models.History." So I am looking for assistance in resolving, do I just need to cast it or something?

Here is the method that gives the 'object not set' error:

public string GetPastAbuseData(int Id)
{

  var query = (from h in _DB.History
              where h.ApplicantId.Equals(Id)
              select h.AbuseComment).FirstOrDefault();

  return query.ToString();
 }

Controller: vm.HistoryModel.AbuseComment = repo.GetPastAbuseData(Id);

And if I change the method type from string to History I get the 'cannot convert' error:

public History GetPastAbuseData(int Id)
{
    return (from h in _DB.History
            where h.ApplicantId.Equals(Id)
            select h.AbuseComment).SingleOrDefault();
}

Thank you for your time.

Upvotes: 8

Views: 37763

Answers (3)

nerdybeardo
nerdybeardo

Reputation: 4675

You can use the null coalescing operator which will check if null and return string.Empty if it is null. ?? Operator

public string GetPastAbuseData(int Id)
{
     return _DB.History.FirstOrDefault(h=>h.ApplicantId.Equals(Id)).Select(h=>h.AbuseComment) ?? string.Empty;
}

Upvotes: 2

Sergey Berezovskiy
Sergey Berezovskiy

Reputation: 236208

You are selecting AbuseComment property (which is string) from HistoryObject. Thus your code tries to convert string to History. Just return whole History entity:

public History GetPastAbuseData(int Id)
{
    return (from h in _DB.History
            where h.ApplicantId.Equals(Id)
            select h).SingleOrDefault();
}

Also in first case query will be of string type. You don't need to call ToString on this variable. Even more, when you fall into OrDefault() case, you will have NullReferenceException.

public string GetPastAbuseData(int Id)
{
  return (from h in _DB.History
          where h.ApplicantId.Equals(Id)
          select h.AbuseComment).FirstOrDefault();
}

Upvotes: 13

mojo722
mojo722

Reputation: 151

Your first example is fine you just need to check for null.

public string GetPastAbuseData(int Id)
{

    var query = (from h in _DB.History
          where h.ApplicantId.Equals(Id)
          select h.AbuseComment).FirstOrDefault();

    return query == null ? string.empty : query;
 }

Upvotes: 5

Related Questions