Está bien, lo haré. Estaba planeando publicar un anuncio, pero luego pensé, si publico una publicación puramente publicitaria, estoy seguro de que habrá muchas maldiciones y ladrillos y huevos volando por todas partes. bueno, coloque el DAC. Con respecto a LINQ personalizado Permítame explicarle el código que admite expresiones. Tal vez sea útil para algunas personas que escriben su propia capa de datos o quieren escribir algunas extensiones prácticas de LINQ. Incluso si no es útil, lo será. sirva como "sugerencia", ¿no sería genial?
En versiones anteriores de DAC, se utilizaba la siguiente expresión para realizar consultas:
IEnumerable<Problema> q = this.dc.Query<Problema>(Problema._.IssueID >= 0);
Este "lindo" "_" parece tan "inmaduro", especialmente en esta era de LINQ desenfrenado, parece muy "avanzando con los tiempos". Entonces existe la versión v2.6 que admite la extensión DAC LINQ.
var q = this.dc.Query<Issue>(s => s.IssueID > 0);
o
var q = de s en (this.dc.GetQueryableData<Issue>())
donde s.IssueID > 0
seleccione s;
La implementación de los dos métodos anteriores se basa principalmente en analizar expresiones y ensamblar declaraciones SQL. La publicación de Lao Zhao está muy bien escrita y también puede consultar el código fuente de DAC (estoy insertando anuncios).
Lo que principalmente quiero decir hoy es que si originalmente tenemos nuestro propio árbol de expresión y su función de análisis, ¿podemos "actualizarlo" fácilmente para que admita LINQ? ! ¡Sí, es fácil!
var q = de s en SystemUser._
donde s.FullName == s.FullName.Max
ordenar por s.UserID
seleccione s.Except(s.Contraseña);
Para permitir que un objeto esté "dónde", "ordenar por", "seleccionar", déjelo implementar métodos llamados "Dónde", "OrderBy", "Seleccionar", o use el método Método de extensión, como en DAC:
clase estática pública QueryExpressionExtension
{
público estático RaisingStudio.Data.Expressions.IQueryExpression<T> Donde<T>(
esta fuente RaisingStudio.Data.Expressions.IQueryExpression<T>,
Expresión<Func<T, RaisingStudio.Data.Expressions.ConditionExpression>> predicado)
{
retorno (nuevo RaisingStudio.Data.Expressions.QueryExpression<T>(
fuente.Valor,
fuente.Tabla,
(predicado.Compile())(fuente.Valor),
fuente.Columnas));
}
público estático RaisingStudio.Data.Expressions.IQueryExpression<T> OrderBy<T>(
esta fuente RaisingStudio.Data.Expressions.IQueryExpression<T>,
Expresión<Func<T, RaisingStudio.Data.Expressions.ColumnExpression>> predicado)
{...}
público estático RaisingStudio.Data.Expressions.IQueryExpression<T> Seleccionar<T>(
esta fuente RaisingStudio.Data.Expressions.IQueryExpression<T>,
Expresión<Func<T, objeto>> predicado)
{...}
}
En la implementación del método, llame al método Compile en la expresión del "sistema" entrante para devolver la expresión "personalizada" y luego guarde estas expresiones "personalizadas" en "QueryExpression")", cuando se ejecute la "consulta". la expresión "personalizada" guardada se puede eliminar directamente. De esta manera, la consulta se puede implementar utilizando el análisis original de la expresión "personalizada" en el código anterior. ! !