2015-06-16 2 views
0

Я пытаюсь получить данные в автозаполнении от JsonResult Action Method в моем контроллере. Я не могу запрашивать данные с LINQ, я использую код, пожалуйста, помогите мне.Не удается получить данные с помощью LINQ в MVC

Действие Метод

public class VehicleController : Controller 
{ 
     private readonly IService<Vehicle> _service; 

     public VehicleController(IService<Vehicle> service) 
     { 
      _service = service; 
     } 
    public JsonResult AutoComplete(string term) 
    { 
     var vehicle = _service.GetAll().Select(c => new { Name = c.Name }); 
     return Json(vehicle, JsonRequestBehavior.AllowGet); 
    } 
} 

EntityRepository

public class EntityRepository<TEntity> : IRepository<TEntity> where TEntity : BaseEntity 
{ 
    private readonly IEntitiesContext _context; 
    private readonly IDbSet<TEntity> _dbEntitySet; 
    private bool _disposed; 

    public EntityRepository(IEntitiesContext context) 
    { 
     _context = context; 
     _dbEntitySet = _context.Set<TEntity>(); 
    } 

    public List<TEntity> GetAll() 
    { 
     return _dbEntitySet.ToList(); 
    } 
} 

IRepository

public interface IRepository<TEntity> : IDisposable where TEntity : BaseEntity 
{ 
    List<TEntity> GetAll(); 
} 

Сервис

public class Service<TEntity> : IService<TEntity> where TEntity : BaseEntity 
{ 
    public IUnitOfWork UnitOfWork { get; private set; } 
    private readonly IRepository<TEntity> _repository; 
    private bool _disposed; 

    public Service(IUnitOfWork unitOfWork) 
    { 
     UnitOfWork = unitOfWork; 
     _repository = UnitOfWork.Repository<TEntity>(); 
    } 

    public List<TEntity> GetAll() 
    { 
     return _repository.GetAll(); 
    } 
} 

IService

public interface IService<TEntity> : IService where TEntity : BaseEntity 
{ 
    List<TEntity> GetAll(); 
} 

Действие Методы возвращают полный список данных, но когда я применить любой фильтр не будет работать и не возвращает значений - например, я попробовал это, и это возвращает нуль:

var vehicle = _service.GetAll().Where(c => c.Name.StartsWith(term)).Select(c => new { Name = c.Name }); 
+0

Извините, но где вы передаете 'term' параметра от действия к способу обслуживания? – Kamo

+0

@ Kamo - это автозаполнение, термин исходит из пользовательского интерфейса и в обслуживании, как я могу пройти? – Anony

+1

Все в порядке, теперь я вижу, как вы его использовали :) Вы уверены, что 'term' соответствует любому результату в вашей БД? Помните, что это сравнение чувствительно к регистру (поэтому «m» не соответствует «M») – Kamo

ответ

1

Убедитесь, что term соответствует случаю данных. После загрузки все данные (.ToList() в DAL), предложение .Where использует сравнение .Net, а не сравнения SQL:

var vehicle = _service.GetAll().Where(c => c.Name.StartsWith(term, StringComparison.OrdinalIgnoreCase)... 

Если в будущем вы хотите изменить это Contains, можно добавить метод расширения:

public static bool Contains(this string source, string toCheck, StringComparison comp) 
    { 
     if (source == null) throw new ArgumentNullException("source"); 
     return source.IndexOf(toCheck, comp) >= 0; 
    } 

затем

var vehicle = _service.GetAll().Where(c => c.Name.Contains(term, StringComparison.OrdinalIgnoreCase)... 
+0

Еще одна вещь, могу ли я применить выбор в результирующем списке?в настоящее время он возвращает все поля, я просто хочу вернуть только поле «Имя», могу ли я сделать это с помощью этого решения? \ – Anony

+0

Конечно, теперь вы подтвердили эту проблему, вы можете изменить тип возвращаемого значения на просто строку и изменить код, который обрабатывает его просто строкой, используя 'Select', который у вас был в исходном вопросе. –

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