Pergunta

Estou convertendo um projeto de usar o LINQ2SQL para usar uma fonte ODATA. Estou tentando procurar um usuário assim ...

FrameworkEntities db = new FrameworkEntities(
    new Uri("http://localhost/odata/FrameworkService.svc"));
User user = db.Users.Where(
    u => SqlMethods.Like(u.UserName, UserName)).FirstOrDefault();

Mas estou recebendo o erro "Método 'booleano (System.String, System.String)' não pode ser usado no cliente; é apenas para tradução para SQL." Isso foi possível no LINQ2SQL, por isso estou me perguntando como mudaria isso para que funcionasse com o serviço Odata. Não encontrei nenhum artigo sobre isso.

Foi útil?

Solução

Como o erro diz, o sqlmethods.like () é para tradução para o SQL. As consultas ODATA não são traduzidas para o SQL, para que você não possa usar o método. Sua melhor aposta é usar o índice de StringComparison.InvariantCultureIgnoreCase para emular uma versão insensível de caso de String.Contains.

Oh ... e você pode combinar suas ligações para Where e FirstOrDefault:

User user = db.Users
              .Where(u => u.UserName.IndexOf(Username, 
                  StringComparison.InvariantCultureIgnoreCase) > 0)
              .FirstOrDefault();

Outras dicas

ODATA contém uma função substratof. Para um pequeno projeto em que trabalhei recentemente, fiquei preocupado se houvesse dados 'como' uma string em três das propriedades do modelo de dados.

$filter=(IN_OUT eq '0' and (substringof('D20033', toupper(BENEFICIARY)) or substringof('D20033', toupper(ORIGINATOR)) or substringof('D20033', toupper(MEMO))))

Também usei a função TOUPPER em torno das propriedades do modelo em conjunto com a capitalização da sequência de pesquisa de entrada de formulários, para que eu tivesse uma pesquisa insensível ao caso. Então, aqui, eu estava preocupado com o fato de ser '0' e 'D20033' em um ou mais dos três campos, beneficiários, originadores ou memorando.

Como alternativa, você pode usar expressões de filtro 'StartSwith' em Odata.

Exemplo:

    var query = context.Users;
    query = query.AddQueryOption("$filter", String.Format("UserName startswith {0}", UserName));
    Users sers = new DataServiceCollection<User>(query);

Isso irá gerar um URI como este:http: // localhost: 7048/odata/usuários? $ filtro = nome de usuário StartSwith 'Obama'

Referência:https://msdn.microsoft.com/en-us/library/hh169248(v=nav.80).aspx

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top