Estoy buscando a utilizar LINQ para algunos la búsqueda de rutinas y quería tener un poco de dinámica en la que las cláusulas. Así, por ejemplo, si un usuario quiere buscar por ciudad o buscar por estado, me gustaría tener un dinámico LINQ Donde<> llamada en lugar de crear dos inflexible expresiones LINQ y, a continuación, utilizar el más apropiado basado en cómo el usuario desea buscar.

Así que me gustaría hacer esto:

String criteria="p.City='Pittsburgh'";  //or "p.State='PA'"
personData.Where(criteria)

lugar de

personData.Where(p => p.City=="Pittsburgh");

o

personData.Where(p => p.State=="PA");

Me llegó a través de un blog por Scott Guthrie hablando acerca de la Dinámica de LINQ en el Visual Studio 2008 muestras. Esto parece hacer lo que quiero, pero mis preguntas son:

  1. Es esta la muestra de la biblioteca compatible con Microsoft?
  2. Scott Guthrie del artículo es en lo que respecta a VS2008 (.NET 3.5). Hay una mejor opción .NET 4? Tal vez algo que fue lanzado con el .NET 4, que realiza lo mismo (o algo muy parecido)?

Gracias de antemano!

  • Puedo ver de inmediato el fallo. Usted no consigue tiempo de compilación comprobación de su LINQ comparers. Si usted no puede ver por qué esto sería útil, tener una mirada en su cadena de criterios…
  • ¿Por qué quieres esto? Parece estar tratando de ser inteligente, por el bien de ser inteligente.
  • Esto es útil para cosas como jqGrid donde los términos de búsqueda son devueltos como cadenas de caracteres para sus controladores. Es agradable tener un marco de manejar, en lugar de tener un montón de código repetitivo.
  • Hoerster: recuerdo haber tenido algunos problemas con esta biblioteca. He encontrado que es mejor desarrollar las expresiones que necesitaba. En este artículo se muestra personalizado expresiones (codeproject.com/KB/aspnet/AspNetMVCandJqGrid.aspx).
  • gracias por el enlace. Voy a echarle un vistazo. Usted debe agregar esto como una respuesta. Gracias.
  • Me puede estar tratando de ser un poco inteligente, pero @snmcdonald explica el uso de esta que se aplica a mi situación. Sólo estoy tratando de entender todas las opciones. Además, viendo Guthrie blog sobre eso aumenta mi interés y me pregunto si esta es una herramienta a utilizar. Gracias!
  • Vea una demostración en rule.codeeffects.com/Linq-to-Sql-Entity-Data-Filter-Demo, hace lo que usted está buscando

4 Comentarios

  1. 6

    Esta característica sería muy bueno tener. Una característica similar existe en ADO.net tablas de datos. Sería realmente útil para LinqToSql así. Asegurarse de que iba a perder el establecimiento inflexible de tipos de cheques, pero eso es todo el punto, desea dinámica de las búsquedas. Si usted maneja las excepciones debidamente realmente creo que es una característica que vale la pena tener.

    Usted puede considerar la adición de un función de solicitud a Microsoft Connect. La biblioteca ya existe tal vez considere la posibilidad de agregar soporte oficial para ello. Si usted hace una solicitud de función asegurarse de que publicar un enlace aquí para que podamos votar por ella. Microsoft Connect cuenta con sistema de votación similar a la de stackoverflow. He presentado un par de mí mismo LinqtoSql TableUpdate y VB.net Readonly Interfaces como C#.

    Recuerdo haber tenido algunos problemas con esta biblioteca. Creo que tenía algo que ver con los métodos estáticos.

    Me pareció mejor para desarrollar las expresiones que necesitaba. Este artículo por Ilya Builuk demuestra personalizado expresiones. La cosa agradable sobre Ilya del marco que elimina una gran cantidad de código repetitivo al realizar operaciones tales como la clasificación de jqGrid.

    Me pareció muy útil cuando el aprendizaje sobre los conceptos subyacentes de las expresiones.

    La cosa buena acerca de este código es que se permite el uso de los operadores de punto de captadores. Person.Age o si quieren violar Demeter usted puede incluso hacer varios captadores.

    El código puede ser mejorado. Creo que he añadido StartsWith y sólo se permite para las operaciones de cadena, así como algunas otras operaciones de búsqueda. A pesar de su pena un vistazo, me ayudó a comprender expresiones linq mucho.

    public static IQueryable<T> Where<T>(this IQueryable<T> query, string column, object value, WhereOperation operation)
    {
    if (string.IsNullOrEmpty(column))
    return query;
    ParameterExpression parameter = Expression.Parameter(query.ElementType, "p");
    MemberExpression memberAccess = null;
    foreach (var property in column.Split('.'))
    memberAccess = MemberExpression.Property
    (memberAccess ?? (parameter as Expression), property);
    //change param value type
    //necessary to getting bool from string
    ConstantExpression filter = Expression.Constant
    (
    Convert.ChangeType(value, memberAccess.Type)
    );
    //switch operation
    Expression condition = null;
    LambdaExpression lambda = null;
    switch (operation)
    {
    //equal ==
    case WhereOperation.Equal:
    condition = Expression.Equal(memberAccess, filter);
    lambda = Expression.Lambda(condition, parameter);
    break;
    //not equal !=
    case WhereOperation.NotEqual:
    condition = Expression.NotEqual(memberAccess, filter);
    lambda = Expression.Lambda(condition, parameter);
    break;
    //string.Contains()
    case WhereOperation.Contains:
    condition = Expression.Call(memberAccess,
    typeof(string).GetMethod("Contains"),
    Expression.Constant(value));
    lambda = Expression.Lambda(condition, parameter);
    break;
    }
    MethodCallExpression result = Expression.Call(
    typeof(Queryable), "Where",
    new[] { query.ElementType },
    query.Expression,
    lambda);
    return query.Provider.CreateQuery<T>(result);
    }

    WhereOperation enumerador:

    public enum WhereOperation { Equal, NotEqual, Contains }
    • No tiene caso insensitice comparar así..
  2. 9

    Puede que desee echar un vistazo a PredicateBuilder

    • esa es una interesante pieza de código. Voy a tener que echarle un vistazo. Gracias!
    • Acabo de probar y no es sensible a mayúsculas. Buen trabajo user295190.
  3. 1

    Yo no creo que sea «compatible» por parte de Microsoft parece ser liberado bajo la licencia pública, que dice en parte:

    (E) El software se otorga bajo licencia «tal como está».
    Usted asume el riesgo de su uso. El
    los contribuyentes no dan express
    garantías o condiciones.
    Usted puede tener otros consumidores
    derechos en virtud de las leyes locales que
    esta licencia no se puede cambiar. A la
    medida permitida en virtud de su local
    las leyes, los contribuyentes excluir la
    las garantías implícitas de comerciabilidad,
    aptitud para un propósito particular y
    de no infracción.

    Sobre su segunda pregunta, no creo que haya una .NET 4 de la versión. El 3.5 debería funcionar bien en un 4.0 proyecto, y creo que no hay mucho para agregar en. Como yo lo entiendo, este fue un ingenioso poco de la biblioteca para hacer los ocasionales, one-off basado en cadenas de consultas de linq. Tal vez se fueron por alguna razón ordenación manual de una red, y la necesidad de modificar tus colecciones de orden basado en una cadena que representa la propiedad en cuestión. Voila. Dudo de que usted verá un montón de esfuerzo puesto en la adición de un montón de características en este.

    • Gracias @Adán. Yo no creo que fue apoyado – así que gracias por la aclaración. Y de la manera que usted describe cómo puede usarse es cómo estoy pensando en usarlo.
    • Sí, yo he usado de manera similar. Creo que es la principal razón de su existencia. Buena suerte!

Dejar respuesta

Please enter your comment!
Please enter your name here