Linq执行查询生成不支持的异常

时间:2014-12-15 17:01:57

标签: linq casting repository

我试图在扩展方法中执行linq查询,但是我在ToArray()函数调用上遇到以下异常 - 看起来查询问题我的IList不知何故,我尝试了许多不同的东西,并用Google搜索但未能看到问题

  

类型' System.NotSupportedException'的例外情况发生在EntityFramework.SqlServer.dll中但未在用户代码中处理

     

其他信息:无法比较类型&System; Series.Collections.Generic.IList`1 [[System.String,mscorlib,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089]]&#39的元素;。仅支持基本类型,枚举类型和实体类型。

代码

public static IList<Shared.Poco.DimValue> ToDimValuePocoList(this IQueryable<DAL.DimValue> source)
{
        IList<Shared.Poco.DimValue> values = new List<Shared.Poco.DimValue>();

        foreach (DAL.DimValue dv in source.ToArray())
        {
            values.Add(new Shared.Poco.DimValue
            {
                DimensionId = dv.DimensionID,
                DimValueName = dv.DimValueName,
                DimValueNo = dv.DimValueNo
            });
        }

        return values;
}

扩展的调用类如下所示:

public class DimValue : IDimValue
{
    private IDimValueRepository _repository;
    private IAccessableDimensionValues _accessableDimensionValues;
    private IRevision _revision;

    public DimValue(IDimValueRepository reposotory, IAccessableDimensionValues accessableDimensionValues, IRevision revision)
    {
        _repository = reposotory;
        _accessableDimensionValues = accessableDimensionValues;
        _revision = revision;
    }

    public IList<Shared.Poco.DimValue> GetDimValueList(int budgetId, Shared.Poco.Dimension dimension, IList<string> dimensionValues, Shared.Poco.User user)
    {
        IList<Shared.Poco.DimValue> values = new List<Shared.Poco.DimValue>();

        int budgetRevisionId = _revision.GetLatesRevision(budgetId);
        IList<string> uniqueAccessableUBLValues = _accessableDimensionValues.GetUniqueAccessableDimensionValues(dimension, user.UserId, budgetRevisionId);

        if (dimensionValues != null && dimensionValues.Count > 0)
        {
            uniqueAccessableUBLValues = dimensionValues;
        }

        return _repository.GetDimValueList(budgetId, dimension.ToString(), uniqueAccessableUBLValues, user).ToDimValuePocoList();
    }

注入的存储库类的实现继承自以下基本存储库类

public interface IRepository<T>
{
    void Insert(T entity);
    void Delete(T entity);
    IQueryable<T> SearchFor(Expression<Func<T, bool>> predicate);
    IQueryable<T> GetAll();
    T GetById(int id);
}

public class Repository<T> : IRepository<T> where T : class
{
    protected DbSet<T> DbSet;

    public Repository(DbContext dataContext)
    {
        DbSet = dataContext.Set<T>();
    }

    #region IRepository<T> Members

    public void Insert(T entity)
    {
        DbSet.Add(entity);
    }

    public void Delete(T entity)
    {
        DbSet.Remove(entity);
    }

    public IQueryable<T> SearchFor(Expression<Func<T, bool>> predicate)
    {
        return DbSet.Where(predicate);
    }

    public IQueryable<T> GetAll()
    {
        return DbSet;
    }

    public T GetById(int id)
    {
        return DbSet.Find(id);
    }

    #endregion
}

存储库实现

public class DimValueRepository : Repository<DimValue>, IDimValueRepository
{
    public DimValueRepository(KonstruktEntities context) : base(context) { }

    public IQueryable<DimValue> GetDimValueList(int budgetId, string dimensionId, IList<string> dimensionFilter, Shared.Poco.User user)
    {
        return this.SearchFor(dv => dv.BudgetID == budgetId && dv.DimensionID == dimensionId &&
            (dimensionFilter == null || dimensionFilter.Count == 0 || dimensionFilter.Contains(dv.DimValueNo)));
    }


    public IQueryable<DimValue> GetDimValueList(Shared.Poco.Dimension dimension, string startsWith, Shared.Poco.User user)
    {
        return this.SearchFor(dv=>dv.DimensionID == dimension.ToString() &&
            dv.DimValueNo.StartsWith(startsWith));
    }
}

修改

它在ToDimValuePocoList函数的下一行失败:

foreach (DAL.DimValue dv in source.ToArray())

以下是调用DimValue

中的扩展名的行
return _repository.GetDimValueList(budgetId, dimension.ToString(), uniqueAccessableUBLValues, user).ToDimValuePocoList();

1 个答案:

答案 0 :(得分:0)

@Will在上面的评论中回答,即不能在我的谓词中使用dimensionFilter。所以我把这个逻辑移到了谓词之外。