1. 程式人生 > >Entity Framework多檢視條件查詢、排序

Entity Framework多檢視條件查詢、排序

      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();