2013-11-11 3 views
2

Я пытаюсь отфильтровать данные, которые возвращаются в поле со списком кендо, фильтрация основана на ID, Мне нужно вернуть все записи, содержащие текст фильтрации, не только равный единице , так что я сделал это, чтобы бросить идентификатор строки в следующей надрезаlinq для объектов не может преобразовать int в строку

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

но это всегда возвращает LINQ к объектам не распознает метод «System.String ToString()»

так я пытался преобразовать dbset в список перед оператором where, как я нашел в другом сообщении LINQ to Entities does not recognize the method 'System.String ToString()' method in MVC 4 , но я получил другую ошибку говорит, что список не содержит определение Где (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); 
     } 
    } 
} 

Любых что я могу сделать, чтобы решить эту проблему?

ответ

10

Доступен класс SqlFunctions, который содержит множество SQL-функций, которые могут использоваться для LINQ. Попробуйте взглянуть на 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). Но я всегда конвертирую целое число в double и работает как ожидалось.

Редактировать: Вы звоните ToList до Where. Поэтому SqlFunctions можно вызывать только в LINQ to Entity query любых SqlFunctions после того, как ToList() является незаконным.

Try без вашего метода GetMany:

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

Спасибо за ответ, но я стараюсь это решение раньше, но такое же возвращение ошибки –

+0

Stange, он должен работать. У меня никогда не было проблем с этим. Я не вижу причины, почему с этим кодом должна возникать одна и та же ошибка. Вы где-то вызываете 'ToString()' –

+0

Нет, я не вызывал ToString() где-либо –

Смежные вопросы