Linqtosql - 返回带接口的自定义类

时间:2009-11-13 11:53:38

标签: c# linq-to-sql repository interface

为什么我不能作为实现ISite的新自定义类(cms.bo.Site)返回?

public IQueryable<ISite> GetSites()
{
    return (from site in Db.Sites select new cms.bo.Site(site.id, site.name));
}

2 个答案:

答案 0 :(得分:4)

基本上LINQ to SQL不知道构造函数会做什么 - 它想尝试将其转换为SQL查询,但不知道如何。您是否需要能够在之后为查询添加额外的位?如果没有,你可以这样做:

public IEnumerable<ISite> GetSites()
{
    return Db.Sites.Select(x => new { x.id, x.name }) // Project in SQL
                   .AsEnumerable() // Do the rest in process
                   .Select(x => new cms.bo.Site(x.id, x.name))
                   .Cast<ISite>(); // Workaround for lack of covariance
}

编辑:我错过了方差方面,并假设查询在执行时失败了。根据tvanfosson的回答,完全值得尝试调用Cast<ISite>() - 但如果这不起作用,请尝试以上方法:)

答案 1 :(得分:3)

试试这个:

    return Db.Sites
             .ToList()
             .Select( s => new cms.bo.Site( s.id, s.name ) )
             .Cast<ISite>()
             .AsQueryable();