gpt4 book ai didi

c# - “An explicit conversion exists”-LINQ

转载 作者:行者123 更新时间:2023-12-02 10:45:38 25 4
gpt4 key购买 nike

到目前为止的故事...

我目前正在学习MVC(4)。我已经编写了充满 Controller Bloat 的应用程序,因此我决定开始添加存储库/UnitOfWork/服务层等。

因此,我决定创建一个通用存储库来封装通用CRUD和记录搜索功能。

“别再说了,您的问题是什么”我听到你说

我以为我会创建一个获取方法,该方法将使用两个Lambda参数:

  • 过滤器=选择/取消选择记录逻辑
  • singleOrDefault =根据参数提供一条记录或默认值。

  • 这是压缩的 通用存储库代码,包括get方法:
     public class GenericRepository<TEntity> :
    IRepository<TEntity> where TEntity : class
    {

    internal AccountsContext context;
    internal DbSet<TEntity> dbSet;


    /// <summary>
    /// Default Constructor.
    /// </summary>
    /// <param name="context"></param>
    public GenericRepository(AccountsContext context)
    {
    this.context = context;
    this.dbSet = context.Set<TEntity>();
    }


    public virtual IEnumerable<TEntity> Get(Expression<Func<TEntity, bool>> filter,
    Expression<Func<TEntity, bool>> singleOrDefault)
    {
    IQueryable<TEntity> query = dbSet;

    if (filter != null && singleOrDefault == null)
    {
    query = query.Where(filter);
    }

    if (filter != null && singleOrDefault != null)
    {
    query = query.Where(filter)
    .SingleOrDefault(singleOrDefault);
    }


    return query.ToList();
    }

    现在,当我尝试构建以下编译器时:

    错误1无法将类型'TEntity'隐式转换为'System.Linq.IQueryable'。存在显式转换(您是否缺少强制转换?)G:\ Accountable \ Accountable \ DataAccessLayer \ GenericRepository.cs 90 30可负责的

    错误在于 .SingleOrDefault(singleOrDefault)行。

    为了您的方便,我使用以下方法提供了扩展方法签名:
        public static IQueryable<TSource> Where<TSource>(this IQueryable<TSource> source, Expression<Func<TSource, bool>> predicate);
    public static TSource SingleOrDefault<TSource>(this IQueryable<TSource> source, Expression<Func<TSource, bool>> predicate);

    很久以来,我一直在盯着这个解决它,任何帮助将不胜感激。

    仅供引用

    在我肿的代码中,我的 Controller 中有以下类型的代码,我想用我的存储库方法替换,这就是我试图复制的代码。
     LedgerCustomer LedgerCustomer = db.LedgerCustomers.Where(l => l.RecordStatus != "X").SingleOrDefault(l => l.id == id);

    CurrencyType currencyType = db.CurrencyTypes.Where(c => c.RecordStatus != "X")
    .SingleOrDefault(c => c.id == LedgerCustomer.CurrencyTypeId);

    问题是:

    A)我是否使用正确的LINQ方法?我my肿的代码中的上述查询是:

    选择其中RecordStatus不等于X(逻辑删除)和ID的分类帐客户
    等于特定的ID。


    因为LedgerCustomer PER ID应该只有一条记录(因为它们是唯一的,所以我使用SingleOrDefault和Where来选择逻辑上删除的任何LedgerCustomer。

    B)帮助编译器错误会有所帮助。

    最佳答案

    问题出在意料之中(正如您预期的那样)。

    query = query.Where(filter).SingleOrDefault(singleOrDefault);
    query是一个IQueryable,因此可以使用 Where(filter).SingleOrDefault(singleOrDefault)完全可以。

    问题在于您正在尝试 SingleOrDefault的结果分配回query SingleOrDefault不返回IQueryable,而仅返回 TEntity的单个实例。

    关于c# - “An explicit conversion exists”-LINQ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12552029/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com