My code in my Data Layer DtbseDropDown = ii.DtbseDropDown is throwing an error and I am not sure how to get around it. The error says: "Cannot implicitly convert type 'bool?' to 'bool'. An explicit conversion exists (are you missing a cast?)"
Here are the code blocks for my Data Layer and my Entities
Data Layer
public static List<ListProjectTypes> GetListProjectTypes()
{
using (var context = new Sys.EntityModels.HousingRehabEntities())
{
// build and execute query against the db
//return context.ListProjectTypes.Where(x => x.DtbseDropDown=true).ToList();
// build and execute query against the db
return (from ii in context.ListProjectTypes
where (ii.DtbseDropDown == true)
//&& ((ii.LastName + ii.FirstName + ii.Middle) != null))
////&& ((ii.LastName) != null))
orderby ii.SortOrder
select new Sys.Entities.ListProjectTypes
{
ProjectType = ii.ProjectType,
SortOrder = ii.SortOrder,
DtbseDropDown = ii.DtbseDropDown
}).ToList();
}
}
}
Entities
namespace CityOfMesa.HousingRehab.Sys.Entities
{
public class ListProjectTypes
{
public string ProjectType { get; set; }
public int? SortOrder { get; set; }
public bool DtbseDropDown { get; set; }
public ListProjectTypes()
{
ProjectType = string.Empty;
SortOrder = 0;
DtbseDropDown = true;
}
}
}
DtbseDropDown
property is bool
(can have true
or false
values) whereas ii.DtbseDropDown
is bool?
(shorthand for Nullable<bool>
, i.e. can also be null
. See Nullable Types (C# Programming Guide) for more). You're trying to assign a bool?
to a bool
, hence the error you are getting. What you need to do is check if the bool?
struct actually has a value first. If it does (.HasValue
), return the actual value (.Value
), else return a default value (I've set the default value to false
here):
DtbseDropDown = ii.DtbseDropDown.HasValue ? ii.DtbseDropDown.Value : false
You can also use ii.DtbseDropDown.GetValueOrDefault()
, as suggested by @test in the comments. The difference between the two is that with my approach you can control what value to output when ii.DtbseDropDown
is null
, whereas Nullable<T>.GetValueOrDefault
returns default(bool)
(i.e. false
) by default.