2

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

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

但它总是返回 linq 到实体不识别方法'system.string tostring()'

所以我尝试在 where 语句之前将 dbset 转换为列表,因为我在另一篇文章中发现 LINQ to Entities 无法识别 MVC 4 中的方法 'System.String ToString()' 方法, 但我收到另一个错误说列表不包含 Where 的定义(dbSet 是 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);
        }
  }
}

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

4

1 回答 1

10

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

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

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

编辑:你在打电话ToList之前Where。因此,SqlFunctions 只能在 aLINQ to Entity query之后的任何 SqlFunctions中调用ToList()是非法的。

尝试不使用 GetMany 方法:

purchaseOrderRepository.Set<PurchaseOrder>()
   .Where(x => SqlFunctions
       .StringConvert((double?) x.PurchaseOrderID)
       .Contains(text))
于 2013-11-11T09:27:55.637 回答