Entity Framework多檢視條件查詢、排序
阿新 • • 發佈:2019-01-23
Entity Framework在C#中常常用於底層和資料庫互動,也就是DAL層。而Entity Framework中與資料庫互動時底層與資料庫通訊的重要的容器就是DbContext。
而使用DbContext對資料庫聯表查詢是最常見的操作。這裡介紹多檢視聯合查詢的加條件,等一些內容
資料介面實現層:using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; using System.Text; namespace RBIM.COMMON { public static class PredicateBuilder { /// <summary> /// 機關函式應用True時:單個AND有效,多個AND有效;單個OR無效,多個OR無效;混應時寫在AND後的OR有效 /// </summary> /// <typeparam name="T"></typeparam> /// <returns></returns> public static Expression<Func<T, bool>> True<T>() { return f => true; } /// <summary> /// 機關函式應用False時:單個AND無效,多個AND無效;單個OR有效,多個OR有效;混應時寫在OR後面的AND有效 /// </summary> /// <typeparam name="T"></typeparam> /// <returns></returns> public static Expression<Func<T, bool>> False<T>() { return f => false; } public static Expression<Func<T, bool>> Or<T>(this Expression<Func<T, bool>> expr1, Expression<Func<T, bool>> expr2) { var invokedExpr = Expression.Invoke(expr2, expr1.Parameters.Cast<Expression>()); return Expression.Lambda<Func<T, bool>> (Expression.Or(expr1.Body, invokedExpr), expr1.Parameters); } public static Expression<Func<T, bool>> And<T>(this Expression<Func<T, bool>> expr1, Expression<Func<T, bool>> expr2) { var invokedExpr = Expression.Invoke(expr2, expr1.Parameters.Cast<Expression>()); return Expression.Lambda<Func<T, bool>> (Expression.And(expr1.Body, invokedExpr), expr1.Parameters); } } }
/// <summary> ///獲取所有資料TransducerConfiguration /// </summary> public IList<FindStressDetectionByProjectKey> GetStressDetectionInfoList(Dictionary<string, string> dicparams) { try { Expression<Func<FindStressDetectionByProjectKey, bool>> searchPredicate = PredicateBuilder.True<FindStressDetectionByProjectKey>(); foreach (string key in dicparams.Keys) { string condition = string.Empty; switch (key.ToLower()) { case "projectkey": //case自己擴充套件 condition = dicparams[key]; searchPredicate = searchPredicate.And(c => c.ProjectKey.ToString() == condition); break; case "smsid": condition = dicparams[key]; searchPredicate = searchPredicate.And(c => c.Smsid == condition); break; case "tdh": condition = dicparams[key]; searchPredicate = searchPredicate.And(c => c.TDH == condition); break; default: break; } } return _dbContext.FindStressDetectionByProjectKey.Where(searchPredicate.Compile()).OrderByDescending(c => c.ID).ToList(); } catch (EntityException e) { throw e.InnerException; } 而UI層呼叫時:
Dictionary<string, string> dicparams = new Dictionary<string, string>(); IList list = HardwareServiceFacade.hardwareService.SoapService.GetStressDetectionInfoList(dicparams).ToList();