Reputation: 3397
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
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
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
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