【问题标题】:linq to entities can not convert int to stringlinq to entity 无法将 int 转换为字符串
【发布时间】:2013-11-11 09:03:03
【问题描述】:

我尝试过滤返回剑道组合框的数据,过滤是基于ID的, 我需要返回包含过滤文本的所有记录,而不仅仅是等于一个,所以我所做的是将 ID 转换为字符串,如下所示

Items = Mapper.Map<List<PurchaseOrder>, List<PurchaseOrderViewModel>>(
                purchaseOrderRepository.GetMany(x => 
                                                x.PurchaseOrderID
                                                 .ToString()
                                                 .Contains(text))
                                                 .ToList());

但它总是返回 linq to entity 无法识别方法“system.string tostring()”

所以我尝试将 dbset 转换为 where 语句之前的列表,正如我在另一篇文章中发现的那样 LINQ to Entities does not recognize the method 'System.String ToString()' method in MVC 4 但我得到另一个错误说该列表不包含 Where (dbSet is an instance of IDbSet) 的定义

public virtual IList<T> GetMany(Expression<Func<T, bool>> where)
{

    return dbset.ToList().Where(where).ToList();
}

这是我的原始(当前)获取方法

sing System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Entity;
using System.Data;
using System.Linq.Expressions;
using Spine.ERP.DataAccess.DbFirstDataAccess;
using Spine.ERP.DataModel.Helpers;
namespace Spine.ERP.DataAccess.Infrastructure
{
    public abstract class RepositoryBase<T> where T : class
    {

        private SSSDBEntities dataContext;

        private readonly IDbSet<T> dbset;

        protected RepositoryBase(IDatabaseFactory databaseFactory)
        {
            DatabaseFactory = databaseFactory;
            dbset = DataContext.Set<T>();
        }

       protected IDatabaseFactory DatabaseFactory
        {
            get;
            private set;
        }


        protected SSSDBEntities DataContext
        {
            get { return dataContext ?? (dataContext = DatabaseFactory.Get()); }
        }
    public virtual IQueryable<T> GetMany(Expression<Func<T, bool>> where)
        {
            return dbset.Where(where);
        }
  }
}

我还能做些什么来解决这个问题?

【问题讨论】:

    标签: c# asp.net-mvc linq entity-framework


    【解决方案1】:

    有一个SqlFunctions 类可用,其中包含许多可用于 LINQ 的 SQL 函数。试试看SqlFunctions.StringConvert

    Items = Mapper.Map<List<PurchaseOrder>, List<PurchaseOrderViewModel>>(
                    purchaseOrderRepository
                       .GetMany(x => SqlFunctions
                                      .StringConvert((double?) x.PurchaseOrderID)
                                      .Contains(text))
                                      .ToList());
    

    不幸的是,只有SqlFunctions.StringConvert(double? number),没有SqlFunctions.StringConvert(int? number)。但我总是将整数转换为双精度数,它按预期工作。

    编辑:您在 Where 之前调用了 ToList。因此,SqlFunctions 只能在LINQ to Entity query 中调用,任何在ToList() 之后的SqlFunctions 都是非法的。

    尝试不使用 GetMany 方法:

    purchaseOrderRepository.Set<PurchaseOrder>()
       .Where(x => SqlFunctions
           .StringConvert((double?) x.PurchaseOrderID)
           .Contains(text))
    

    【讨论】:

    • 感谢您的回复,但我之前尝试过此解决方案,但返回相同的错误
    • 斯坦格,它应该可以工作。我从来没有遇到过这个问题。我看不出为什么使用此代码会出现相同的错误。你在哪里打电话给ToString()
    • 不,我没有在任何地方调用 ToString()
    • 我不明白为什么你会得到完全相同的错误。至少应该不一样。 (我已经编辑了上面的代码:不是演员加倍?而不是加倍;也许这就是问题所在)
    • 感谢您的帮助,但它仍然会引发相同的错误,也许它应该先转换为 List 然后过滤,但我不能这样做,因为它总是返回找不到的地方
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-28
    • 2011-11-16
    • 1970-01-01
    • 1970-01-01
    • 2011-11-15
    • 2020-03-23
    • 1970-01-01
    相关资源
    最近更新 更多