Ok, farei isso. Eu estava planejando postar um anúncio, mas então pensei, se eu postar um post puramente publicitário, tenho certeza que haverá muitas maldições e tijolos e ovos voando por toda parte. bem, coloque o DAC. Em relação ao LINQ personalizado Deixe-me explicar o código que suporta expressões. Talvez seja útil para algumas pessoas que escrevem sua própria camada de dados ou desejam escrever algumas extensões LINQ práticas. servir de “sugestão”, não seria ótimo!
Nas versões anteriores do DAC, a seguinte expressão era usada para consultar:
IEnumerable<Problema> q = this.dc.Query<Problema>(Problema._.IssueID >= 0);
Esse "_" "fofo" parece tão "imaturo", especialmente nesta era de LINQ desenfreado, que parece muito "avançando com o tempo". Portanto, existe a versão v2.6 que suporta a extensão DAC LINQ.
var q = this.dc.Query<Issue>(s => s.IssueID > 0);
ou
var q = de s em (this.dc.GetQueryableData<Issue>())
onde s.IssueID> 0
selecione;
A implementação dos dois métodos acima depende principalmente da análise de expressões e da montagem de instruções SQL. A postagem de Lao Zhao está muito bem escrita, e você também pode dar uma olhada no código fonte do DAC (estou inserindo anúncios).
O que quero dizer principalmente hoje é que, se originalmente tivermos nossa própria árvore de expressão e sua função de análise, podemos "atualizá-la" facilmente para suportar LINQ? ! Sim, é fácil!
var q = de s em SystemUser._
onde s.FullName == s.FullName.Max
ordenar por s.UserID
selecione s.Except(s.Password);
Para permitir que um objeto seja "where", "orderby", "select", deixe-o implementar métodos chamados "Where", "OrderBy", "Select" ou use o método Extension Method, assim como no DAC:
classe estática pública QueryExpressionExtension
{
público estático RaisingStudio.Data.Expressions.IQueryExpression<T> Where<T>(
esta fonte RaisingStudio.Data.Expressions.IQueryExpression<T>,
Expressão<Func<T, RaisingStudio.Data.Expressions.ConditionExpression>> predicado)
{
retornar (novo RaisingStudio.Data.Expressions.QueryExpression<T>(
fonte.Valor,
fonte.Tabela,
(predicado.Compile())(fonte.Valor),
fonte.Colunas));
}
público estático RaisingStudio.Data.Expressions.IQueryExpression<T> OrderBy<T>(
esta fonte RaisingStudio.Data.Expressions.IQueryExpression<T>,
Expressão<Func<T, RaisingStudio.Data.Expressions.ColumnExpression>> predicado)
{…}
público estático RaisingStudio.Data.Expressions.IQueryExpression<T> Select<T>(
esta fonte RaisingStudio.Data.Expressions.IQueryExpression<T>,
Expressão<Func<T, objeto>> predicado)
{...}
}
Na implementação do método, chame o método Compile na expressão "sistema" recebida para retornar a expressão "personalizada" e, em seguida, salve essas expressões "personalizadas" em "QueryExpression" )", quando a "consulta" for executada, a expressão "personalizada" salva pode ser retirada diretamente. Dessa forma, a consulta pode ser implementada usando a análise original da expressão "personalizada" no código acima! ! !