Используя Linq 2 EF, как бы я нашел идентификатор guid, начинающийся с ‘x’?

#.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 для выполнения . Запускает запрос с помощью функции().