I am using Linq to query my database and returning a generic IList.
Whatever I tried I couldn't convert an IQueryable to an IList.
Here is my code.
I cannot write simpler than this and I don't understand why it is not working.
public IList<IRegion> GetRegionList(string countryCode)
{
var query = from c in Database.RegionDataSource
where (c.CountryCode == countryCode)
orderby c.Name
select new {c.RegionCode, c.RegionName};
return query.Cast<IRegion>().ToList();
}
This returns an list with the right number of items but they are all empty Please help, I am bloqued with this for a couple of days now
The interface IEnumerable<T> is not convertible to IList and attempting to pass a variable of type IEnumerable<T> to a method taking IList will result in a compilation error. Convert the IEnumerable<T> instance to a new object which is convertible to IList . For example, in 3.5+ you can call the .
Like IEnumerable, IList is also best to query data from in-memory collections like List, Array etc. IList is useful when you want to Add or remove items from the list. IList can find out the no of elements in the collection without iterating the collection. IList supports deferred execution.
If you do not counting in your external code it is always better to return IEnumerable, because later you can change your implementation (without external code impact), for example, for yield iterator logic and conserve memory resources (very good language feature by the way).
IEnumerable is conceptually faster than List because of the deferred execution. Deferred execution makes IEnumerable faster because it only gets the data when needed. Contrary to Lists having the data in-memory all the time.
Your select
statement returns an anonymous type: new {c.RegionCode, c.RegionName}
This can't be converted to IRegion
- that would basically be Duck-typing, which C# doesn't support.
Your linq statement should return a type that implements IRegion
- then your code should work.
However it shouldn't run - the Cast<IRegion>
should throw a runtime exception.
Basically:
// this isn't anonymous, and should cast
public class MyRegion : IRegion {
public string RegionCode {get;set;}
public string RegionName {get;set;}
}
public IList<IRegion> GetRegionList(string countryCode)
{
var query = from c in Database.RegionDataSource
where (c.CountryCode == countryCode)
orderby c.Name
select new MyRegion {RegionCode = c.RegionCode, RegionName = c.RegionName};
return query.Cast<IRegion>().ToList();
}
Update
If the underlying Linq type implements IRegion
this can be a lot simpler:
public IList<IRegion> GetRegionList(string countryCode)
{
var query =
from region in Database.RegionDataSource
where region.CountryCode == countryCode
orderby region.Name
select region;
return query.ToList();
}
I'm surprised it's not just failing completely - you're trying to cast each result to an IRegion
, but you're generating instances of an anonymous type, which certainly won't implement IRegion
.
Do you have a concrete type which implements IRegion
?
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With