Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

LINQ Sử dụng like thay vì ((NVL (INSTR (x, y), 0)) =1)

Khi nhìn xung quanh, tôi đã tìm thấy toán tử LIKE trong LINQ đó là một trong đó có một vài ví dụ tốt về cách bạn có thể làm điều này. Tôi đã kiểm tra cái bên dưới lấy từ liên kết ở trên

Đây là tiện ích mở rộng để sử dụng Thích với lambda đã được đăng bởi adobrzyc

    public static class LinqEx
    {
        private static readonly MethodInfo ContainsMethod = typeof(string).GetMethod("Contains");
        private static readonly MethodInfo StartsWithMethod = typeof(string).GetMethod("StartsWith", new[] { typeof(string) });
        private static readonly MethodInfo EndsWithMethod = typeof(string).GetMethod("EndsWith", new[] { typeof(string) });

        public static Expression<Func<TSource, bool>> LikeExpression<TSource, TMember>(Expression<Func<TSource, TMember>> property, string value)
        {
            var param = Expression.Parameter(typeof(TSource), "t");
            var propertyInfo = GetPropertyInfo(property);
            var member = Expression.Property(param, propertyInfo.Name);

            var startWith = value.StartsWith("%");
            var endsWith = value.EndsWith("%");

            if (startWith)
                value = value.Remove(0, 1);

            if (endsWith)
                value = value.Remove(value.Length - 1, 1);

            var constant = Expression.Constant(value);
            Expression exp;

            if (endsWith && startWith)
            {
                exp = Expression.Call(member, ContainsMethod, constant);
            }
            else if (startWith)
            {
                exp = Expression.Call(member, EndsWithMethod, constant);
            }
            else if (endsWith)
            {
                exp = Expression.Call(member, StartsWithMethod, constant);
            }
            else
            {
                exp = Expression.Equal(member, constant);
            }

            return Expression.Lambda<Func<TSource, bool>>(exp, param);
        }

        public static IQueryable<TSource> Like<TSource, TMember>(this IQueryable<TSource> source, Expression<Func<TSource, TMember>> parameter, string value)
        {
            return source.Where(LikeExpression(parameter, value));
        }

        private static PropertyInfo GetPropertyInfo(Expression expression)
        {
            var lambda = expression as LambdaExpression;
            if (lambda == null)
                throw new ArgumentNullException("expression");

            MemberExpression memberExpr = null;

            switch (lambda.Body.NodeType)
            {
                case ExpressionType.Convert:
                    memberExpr = ((UnaryExpression)lambda.Body).Operand as MemberExpression;
                    break;
                case ExpressionType.MemberAccess:
                    memberExpr = lambda.Body as MemberExpression;
                    break;
            }

            if (memberExpr == null)
                throw new InvalidOperationException("Specified expression is invalid. Unable to determine property info from expression.");


            var output = memberExpr.Member as PropertyInfo;

            if (output == null)
                throw new InvalidOperationException("Specified expression is invalid. Unable to determine property info from expression.");

            return output;
        }
    }

Để sử dụng nó, bạn chỉ cần thêm chức năng Like vào nơi bạn đặt các chức năng Chứa. Bạn có thể xem ví dụ bên dưới

            using (CustomerEntities customerContext = new CustomerEntities())
            {
                IQueryable<Customer> customer = customerContext.Customer.Like(x => x.psn, "%1%");    
            }

Điều này sẽ tạo ra một truy vấn sql trông giống như thế này.

SELECT 
[Extent1].[psn] AS [psn]
FROM [dbo].[Customer] AS [Extent1]
WHERE [Extent1].[psn] LIKE '%1%'



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm thế nào để trả về số giây trước nửa đêm trong cơ sở dữ liệu Oracle

  2. Làm cách nào để kết nối với Cơ sở dữ liệu Oracle bằng cx_Oracle với tên dịch vụ và thông tin đăng nhập?

  3. Lỗi mới trong khởi động mùa xuân 2.3.0.RELEASE:UnsatisfiedDependencyException cho Oracle 12.2.0.1 jdbcdriver nhưng không phải với mysql jdbcdriver

  4. Tôi có thể xâu chuỗi các liên kết cơ sở dữ liệu trong Oracle không?

  5. SQL Server tương đương với hàm WM_CONCAT