Pergunta

Eu estou tentando criar uma declaração de Linq que consulta ambas as colunas que existem na minha entidade como propriedades e aqueles que não o fazem, mas existem como colunas no banco de dados para a entidade.

Por exemplo, eu tenho uma coleção de entidades Livro. Cada livro tem uma propriedade ID e Título e uma coluna correspondente no banco de dados. Mas, digamos que a mesa para o livro também contém um campo de coluna para Autor e minha entidade livro não tem isso.

A consulta normal, envolvendo a identificação eo título pode ter esta aparência:

Books.Where(b=>b.ID == 123 && b.Title == "Title")

Mas, eu quero também adicionar dinamicamente o equivalente a " E Author = 'Nome' " para a consulta acima também. A propriedade Autor não existe no objeto Book.

Os campos extras e os valores que devem conter vai realmente estar disponível em um dicionário. Então eu vou precisar adicionar dinamicamente vários E [FieldName] = '[valor]' condições para a consulta.

Pode ajudar a explicar por que eu preciso disso para saber que eu estou usando armazenamento de tabelas Azure e eu substituído o serialize que transforma uma entidade Livro para o XML armazenados em Azure.

Editar -

Eu tentei usar a biblioteca dinâmico Linq, mas ele não funciona.

Books.Where(b=>b.ID == 123 && b.Title == "Title").Where("Author = @0", "SomeName").ToList();

Lança: System.Linq.Dynamic.ParseException:. Não propriedade ou campo 'Autor' existe no tipo 'Livro'

Além disso,

Eu sei que usando Books.AddQueryOption ( "$ filtro", "Autor eq 'SomeName'") funciona quando usado por si só. Mas eu não tenho nenhuma idéia de como usar AddQueryOption junto com um já existente Onde comunicado.

Foi útil?

Solução 2

Isso não é possível com o LINQ

Outras dicas

Sem adicionar Autor de livro, você teria que passar um outro objeto com o autor sobre ele:

var x = new { Author="SomeName" };  
    Books.Where(b=>b.Id == 1 && b.Title == "Alpha").Where("@1.Author == @0", "SomeName", x);

ou herdar do livro e adicionar uma propriedade Autor apenas para esta finalidade:

public class BookEx : Book {
    public string Author { get; set; }
}

Books.Cast<BookEx>().Where(b=>b.Id == 1 && b.Title== "Alpha").Where("Author == @0", "SomeName");

Tente o seguinte código:

var result = _tofiObjectList.Where(o => o.GetType() == mainObjType)
    .AsQueryable().Cast(relation.MainObject.EntityType).Where(relation.MainObject.Filter);

Este é um método de extensão para o tipo IQueryable:

public static IQueryable Cast(this IQueryable source, string type)
{
    switch (type)
    {
        case "TofiDataCollection.Service.TofiEntity.Obj":
            return source.Cast<Obj>();
    }
    return source;
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top