У меня есть ситуация, когда мне нужно, чтобы мой запрос LINQ to Entities возвращал подстроку в зависимости от длины строки.Вот запрос:
var query = (
from f in Context.Files
orderby f.DateAdded descending
select new
{
Concerns = f.Concerns.Name,
Sender = f.Sender.Name,
CategoryCount = f.Categories.Count(),
DateAdded = f.DateAdded,
Comment = (f.Comment == null || f.Comment.Length < 5)
? f.Comment : f.Comment
}).Take(10);
Итак, я получаю последние 10 добавленных сущностей типа Files, а затем выбираю из них набор свойств для отображения внутри списка.Некоторые из них - простые строки (Концерны, Отправитель).CategoryCount возвращает количество категорий, связанных с объектом File.
Однако я хочу, чтобы комментарий был обрезан, если он длиннее заданной длины.В приведенном выше коде все работает правильно.Теперь, когда я заменяю эту строку:
Comment = (f.Comment == null || f.Comment.Length < 5)
? f.Comment : f.Comment
На эту строку:
Comment = (f.Comment == null || f.Comment.Length < 5)
? f.Comment : f.Comment.SubString(0,5)
приложение выдает исключение XamlParseException (???)
Вызовконструктора типа «DocumentManager.Views.ListEntriesView», который соответствует указанным ограничениям связывания, вызвала исключение
Я действительно не знаю, почему он это сделал.Метод SubString не поддерживается в LINQ?
Надеюсь, что кто-то может мне помочь.А пока я просто оставлю все как есть.
РЕДАКТИРОВАТЬ 2 (почему-то мое первое редактирование потеряно. Поэтому я его переделываю): основываясь на полученных комментариях, я изменил свой код наэто и сейчас работает:
var query = App.Context.Files.OrderByDescending(File => File.DateAdded).Take(10).AsEnumerable()
.Select(File => new
{
Concerns = File.Concerns.Name,
Sender = File.Sender.Name,
CategoryCount = File.Categories.Count(),
DateAdded = File.DateAdded,
Comment = (File.Comment == null || File.Comment.Length < 100) ? File.Comment : File.Comment.Substring(0, 100) + "..."
});
Я забыл упомянуть, что я использую SQLite.Так что, возможно, Substring не реализована в провайдере SQLite EF.