#.net #linq #entity-framework
#.net #linq #entity-framework
Вопрос:
Используя Linq2Entities (EF4), мне нужно запросить объект, у которого есть Guid
свойство (вызвать его id
). Мне нужно запросить, есть ли у моей сущности какие-либо записи, у id
которых s начинаются с заданного префикса.
По сути, мне нужно что-то вроде
from items in myEntity
where items.id.ToString().StartsWith(prefix)
// rest of the query
Теперь я знаю, что L2EF не поддерживает преобразования Guid
членов с помощью ToString()
.
SqlFunctions.StringConvert()
Помощник также не поддерживает его, поскольку не принимает Guid
аргумент.
И я не могу использовать SQL LIKE
, как в
from items in myEntity
where items.id like 'prefix%'
потому что он также не поддерживается L2EF.
Все рекомендации, которые я нашел до сих пор, предполагают использование Contains()
, но это просто не то же самое, что starts with
…. В случае Guid
s, например, первые 8 символов могут быть найдены в последних 13 символах.
Итак, как бы ВЫ использовали L2EF для запроса записей, которые имеют идентификатор Guid, начинающийся с «prefix» ?
Я могу вспомнить о некоторых хитростях, таких как преобразование uniqueidentifier
поля внутренней базы данных SQL в varchar()
, но я действительно хотел бы понять, делаю ли я это неправильно, прежде чем прибегать к чему-то подобному.
Ответ №1:
Два варианта: 1) измените свою модель данных объекта таким образом, чтобы все, что означает «x», было перенесено в свойство этого объекта, а не тесно связано с уникальным идентификатором
2) соберите весь список объектов в коллекцию, затем, после того как они будут загружены в память, просмотрите и выполните идентификатор.Запрос toString().Contains() к коллекции. Как только он будет загружен в память, среда CLR позволит это. Хотя, ужасные накладные расходы.
Я бы выбрал # 1, если это возможно.
Ответ №2:
Используйте ExecuteStoreQuery
в вашем контексте и выполните пользовательскую инструкцию SQL непосредственно в вашем контексте. Что-то вроде:
string prefix = '00000000';
const string sql = "select * from myEntities where id like @prefix '%'";
var matches = context.ExecuteStoreQuery<MyEntityType>(sql, prefix);
Кроме того, ознакомьтесь с этим примером MSDN.
Комментарии:
1. Обновление: Увидев, что другой ответ получил больше голосов «за», я подумал об этом еще немного. Я отметил это как правильный ответ, потому что я использовал его, и он абсолютно работает, и он достаточно общий, чтобы решить больший класс потенциальных ограничений с помощью L2EF. Но теперь я понимаю, что это обошло актуальный вопрос, вообще не используя LINQ. Предложение отделить свойство EF от базы данных путем создания строкового свойства на основе guid действительно позволяет использовать LINQ для выполнения . Запускает запрос с помощью функции().