Entity Framework v4.1 НРАВИТСЯ - PullRequest
       35

Entity Framework v4.1 НРАВИТСЯ

8 голосов
/ 01 июня 2011

Как мне построить свой запрос, чтобы получить выходной SQL-запрос, например:

SELECT
[viewRegisters].[Id] AS [IdRegister]
WHERE Name LIKE '%a%bc'

OR

SELECT
[viewRegisters].[Id] AS [IdRegister]
WHERE Name LIKE 'a%b%c'

OR

SELECT
[viewRegisters].[Id] AS [IdRegister]
WHERE Name LIKE 'a%b%c%'

Я использую .Net Framework 4.0, Entity Framework v4.1 и C #.

EF v4.1 преобразует этот тип запросов linq из:

((IQueryable<T>)Data).Where(z => z.Field.Contains("a%b%c%"));

В:

SELECT
[viewRegisters].[Id] AS [Id]
WHERE Name LIKE N'a~%b~%c~%' ESCAPE N'~'

Это не то, что я хочу. Я хочу иметь возможность использовать символ процента, как я делаю непосредственно в БД.

Ответы [ 3 ]

7 голосов
/ 01 июня 2011

Вы должны использовать ESQL , если вам нужна полная поддержка подстановочных знаков.Linq-to-entity не может этого сделать, и сначала код EFv4.1 (без EDMX) не поддерживает функции, определенные моделью , поэтому решение, предоставленное @Johann Blais, использовать нельзя.*

Полагаю, код для запуска запроса ESQL может выглядеть следующим образом:

string command = "SELECT VALUE e FROM ContextName.DbSetName AS e WHERE e.Field LIKE 'a%b%c%'"
ObjectContext ctx = ((IObjectContextAdapter)dbContext).ObjectContext;
ObjectQuery<EntityType> query = new ObjectQuery<EntityType>(command, ctx);
ObjectResult<EtntiyType> result = query.Execute(MergeOption.AppendOnly);
4 голосов
/ 03 ноября 2011

Если вы используете SQL Server, используйте функцию PATINDEX для поиска по шаблону. Вы можете получить доступ к этой функции через EF, используя SqlFunctions класс.

Например, следующий запрос EF

context.ViewRegisters.Where(z => SqlFunctions.PatIndex("a%b%c%", z.Name) > 0);

переведет в

SELECT 
[Extent1].[Id] AS [Id], 
[Extent1].[Name] AS [Name]
FROM [dbo].[ViewRegisters] AS [Extent1]
WHERE (CAST(PATINDEX(N'a%b%c%', [Extent1].[Name]) AS int)) > 0
1 голос
/ 01 июня 2011
var query = from viewRegister in context.ViewRegisters
where viewRegister.Name.Contains("yourname")
select viewRegister;
...