IQueryable扩展方法从Generic方法编译错误

时间:2017-07-23 04:31:19

标签: c# generics iqueryable

IQueryable扩展方法在普通方法中很好,但不在泛型方法中。

编译错误: IQueryable不包含MyExtension的定义和最佳扩展方法重载DataExtensions.MyExtension(IQueryable Fred)需要IQueryable Fred类型的接收器

目标是将下面的// do something interesting转换为适用于所有FlintstoneObject类型的通用方法。

public static class RepetitiveCodeBelow
{
    public static int RepetitiveCode()
    {
        var count = 0;
        using (var context = new DataContext())
        {
            foreach (var data in context.Freds.AsNoTracking().Where(item => item.PrimaryKey > 0).MyExtension())
            {
                // do something interesting
            }

            foreach (var data in context.Barnies.AsNoTracking().Where(item => item.PrimaryKey > 0).MyExtension())
            {
                // do something interesting
            }

            // more types omitted
        }
        return count;
    }
}

工作版:

    public List<Fred> GetFredList()
    {
        using (var context = new DataContext())
        {
            return context.Freds.AsNoTracking().MyExtension().ToList();
        }
    }

不会编译:

    public List<T> GetList<T>() where T : FlintstoneObject<T>, new()
    {
        using (var context = new DataContext())
        {
            return context.Set<T>().AsNoTracking().MyExtension().ToList();
        }
    }

完整示例

public abstract class FlintstoneObject<T> where T : class
{
    public abstract int PrimaryKey { get; set; }
}

public class Fred : FlintstoneObject<Fred>
{
    public override int PrimaryKey { get; set; }
}

public class Barny : FlintstoneObject<Barny>
{
    public override int PrimaryKey { get; set; }
}

public static class DataExtensions
{
    public static IQueryable<Fred> MyExtension(this IQueryable<Fred> queryable)
    {
        return queryable;
    }
}

public class DataContext : DbContext
{
    public DbSet<Fred> Freds { get; set; }
    public DbSet<Barny> Barnies { get; set; }

    public List<Fred> GetFredList()
    {
        using (var context = new DataContext())
        {
            return context.Freds.AsNoTracking().MyExtension().ToList();
        }
    }

    public List<T> GetList<T>() where T : FlintstoneObject<T>, new()
    {
        using (var context = new DataContext())
        {
            return context.Set<T>().AsNoTracking().MyExtension().ToList();
        }
    }
}

1 个答案:

答案 0 :(得分:0)

您的代码可能缺少此扩展程序:

    public static IQueryable<T> MyExtension<T>(this IQueryable<T> queryable)
    {
        return queryable;
    }

使其可编辑。

无论如何,你打算用通用的东西看起来很奇怪:

public class Fred : FlintstoneObject<Fred>

我认为T应该是继承泛型Fred的{​​{1}}以外的某个类。