MVC LINQ to Entities не распознает функцию вызова метода - когда вызывать функцию? - PullRequest
0 голосов
/ 02 ноября 2018

Я пытаюсь вызвать функцию во время оператора LINQ, которая явно не может быть переведена в SQL. Вот мой код, я пытаюсь преобразовать дату и время в количество недель. Каков наилучший подход, нужно ли циклически просматривать данные после и обновлять ViewModel?

Контроллер

public ActionResult Listings(string categoryName)
{
    HomeServices service = new HomeServices();

    return View(service.GetListingsViewModel(categoryName);
}

Просмотр модели

public class ResultsViewModel
{
    public System.Guid AdGuid { get; set; }
    public Nullable<System.DateTime> ListDate { get; set; }
    public string ListingAge { get; set; }
    public string Image1 { get; set; }

}
public class ListingsViewModel
{
    public IEnumerable<ResultsViewModel> ResultsVM { get; set; }
    public int TotalCount { get; set; }
}

Услуга

internal ListingsViewModel GetListingsViewModel(string categoryName)
{
    var listings = GetListingsVM(categoryName);
    var totalCount = listings.Count();

    return new ListingsViewModel()
    {
        ListingResultsVM = listings,
        TotalCount = totalCount
    };
}

internal IEnumerable<ResultsViewModel> GetListingsVM(string categoryName)
{
    var listings = Listings
      .Where(x => x.Category == categoryName)
      .Select(x => new ResultsViewModel
    {
        AdGuid = x.AdGuid,
        ListDate = x.ListDate,
        ListingAge = Logic.App.GetListingAge(x.BirthDate ?? DateTime.Now),
        Image1 = x.ListingImage.Image1
    });

    return listings;
}

Logic.App

public static string GetListingAge(System.DateTime varListDate)
{
    //Function code to convert DateTime to Weeks
    return functionReturnValue;
}

Ответы [ 2 ]

0 голосов
/ 02 ноября 2018

Я пытаюсь вызвать метод, который явно не может быть вызван в SQL.

Ты уверен? В последней версии SQL вы можете указать EF вызывать пользовательскую функцию в базе данных вместо вызова функции C #.

Вы хотите аннотировать функцию с помощью DbFunction.

0 голосов
/ 02 ноября 2018

Сначала загрузите необходимые данные. Затем локально манипулируйте им в требованиях.

var listings = Listings
  .Where(x => x.Category == categoryName)
  .Select(x => new 
  {
    AdGuid = x.AdGuid,
    ListDate = x.ListDate,
    Image1 = x.ListingImage.Image1
  })
  .AsEnumerable() // make call to DB
  .Select(x => new ResultsViewModel
  {
    AdGuid = x.AdGuid,
    ListDate = x.ListDate,
    ListingAge = Logic.App.GetListingAge(x.BirthDate ?? DateTime.Now),
    Image1 = x.Image1
  })
  .ToList();  //Materialize the local query into a real list.

Я настоятельно рекомендую вам всегда .ToList() в конце этих звонков. Другие мудрые множественные вызовы этого метода вернут буквально другой список ResultsViewModel.

Что может произойти, если вы вернете IQueryable как IEnumerable .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...