Linq扩展(利用HashSet去重):
public static class LinqExtensions
{
public static IEnumerable<TSource> DistinctBy<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector)
{
var seenKeys = new HashSet<TKey>();
return source.Where(element => seenKeys.Add(keySelector(element)));
}
}
应用:var a = alist.DistinctBy(s => s).ToList();
Database扩展
/// <summary>
/// 动态查询数据
/// </summary>
public class DataRecordDynamicWrapper : DynamicObject {
private IDataRecord _dataRecord;
public DataRecordDynamicWrapper(IDataRecord dataRecord) { _dataRecord = dataRecord; }
public override bool TryGetMember(GetMemberBinder binder, out object result) {
result = _dataRecord[binder.Name];
return result != null;
}
}
public static class DatabaseExtensions {
/// EF SQL 语句返回 dataTable
/// </summary>
/// <param name="db"></param>
/// <param name="sql"></param>
/// <param name="parameters"></param>
/// <returns></returns>
public static DataTable SqlQueryForDataTatable(this Database db,
string sql,
SqlParameter[] parameters) {
using (SqlConnection conn = new System.Data.SqlClient.SqlConnection()) {
conn.ConnectionString = db.Connection.ConnectionString;
if (conn.State != ConnectionState.Open) {
conn.Open();
}
using (SqlCommand cmd = new SqlCommand()) {
cmd.Connection = conn;
cmd.CommandText = sql;
if (parameters != null) {
if (parameters.Length > 0) {
foreach (var item in parameters) {
cmd.Parameters.Add(item);
}
}
}
SqlDataAdapter adapter = new SqlDataAdapter(cmd);
DataTable table = new DataTable();
adapter.Fill(table);
return table;
}
}
}
/// <summary>
/// 执行查询
/// </summary>
/// <param name="db"></param>
/// <param name="commandText"></param>
/// <param name="parameters"></param>
/// <returns></returns>
public static IEnumerable<dynamic> Execute(this Database db, string commandText, params object[] parameters) {
using (var connection = new SqlConnection(db.Connection.ConnectionString)) {
using (var command = new SqlCommand(commandText, connection)) {
if (connection.State != ConnectionState.Open) {
connection.Open();
}
if (parameters.Length > 0) {
foreach (var item in parameters) {
command.Parameters.Add(item);
}
}
using (SqlDataReader reader = command.ExecuteReader()) {
foreach (IDataRecord record in reader) {
yield return new DataRecordDynamicWrapper(record);
}
}
}
}
}
public static IEnumerable SqlQueryForDynamic(this Database db,
string sql,
params object[] parameters) {
return Execute(db, sql, parameters);
}
}
Linqstring字段扩展
/// <summary>
/// 扩展Linqstring字段Where条件组合
/// </summary>
internal class ParameterReplacer : ExpressionVisitor {
public ParameterReplacer (ParameterExpression paramExpr) {
this.ParameterExpression = paramExpr;
}
public ParameterExpression ParameterExpression { get; private set; }
public Expression Replace (Expression expr) {
return this.Visit(expr);
}
protected override Expression VisitParameter (ParameterExpression p) {
return this.ParameterExpression;
}
}
/// <summary>
/// 扩展Linqstring字段Where条件组合
/// </summary>
public static class PredicateExtensionses {
public static Expression<Func<T, bool>> True<T> () { return f => true; }
public static Expression<Func<T, bool>> False<T> () { return f => false; }
public static Expression<Func<T, bool>> And<T> (this Expression<Func<T, bool>> exp_left, Expression<Func<T, bool>> exp_right) {
var candidateExpr = Expression.Parameter(typeof(T), "candidate");
var parameterReplacer = new ParameterReplacer(candidateExpr);
var left = parameterReplacer.Replace(exp_left.Body);
var right = parameterReplacer.Replace(exp_right.Body);
var body = Expression.And(left, right);
return Expression.Lambda<Func<T, bool>>(body, candidateExpr);
}
public static Expression<Func<T, bool>> Or<T> (this Expression<Func<T, bool>> exp_left, Expression<Func<T, bool>> exp_right) {
var candidateExpr = Expression.Parameter(typeof(T), "candidate");
var parameterReplacer = new ParameterReplacer(candidateExpr);
var left = parameterReplacer.Replace(exp_left.Body);
var right = parameterReplacer.Replace(exp_right.Body);
var body = Expression.Or(left, right);
return Expression.Lambda<Func<T, bool>>(body, candidateExpr);
}
/// <summary>
/// 使之支持Sql in语法
/// </summary>
/// <typeparam name = "T"></typeparam>
/// <typeparam name = "TValue"></typeparam>
/// <param name = "query"></param>
/// <param name = "obj"></param>
/// <param name = "values"></param>
/// <returns></returns>
public static IQueryable<T> WhereIn<T, TValue> (this IQueryable<T> query, Expression<Func<T, TValue>> obj, IEnumerable<TValue> values) {
return query.Where(BuildWhereInExpression(obj, values));
}
private static Expression<Func<TElement, bool>> BuildWhereInExpression<TElement, TValue> (Expression<Func<TElement, TValue>> propertySelector, IEnumerable<TValue> values) {
ParameterExpression p = propertySelector.Parameters.Single();
if (!values.Any())
return e => false;
var equals = values.Select(value => (Expression)Expression.Equal(propertySelector.Body, Expression.Constant(value, typeof(TValue))));
var body = equals.Aggregate<Expression>((accumulate, equal) => Expression.Or(accumulate, equal));
return Expression.Lambda<Func<TElement, bool>>(body, p);
}
}
应用:where.And(s => s.account == vAddMoney.account);
where.Or(p => p.msg.Contains(tborder));
对string,object,type等的扩展
/// <summary>
/// 专门处理扩张方法类
/// </summary>
public static class ExtensionHelper {
/// <summary>
/// 扩张方法 转换字符串默认为 ""
/// </summary>
/// <returns></returns>
public static string ToEString(this object s) {
if (s == null) {
return "";
} else {
return s.ToString();
}
}
/// <summary>
/// 扩张方法 转换字符串默认为 ""
/// </summary>
/// <returns></returns>
public static string ToEString(this object s ,string defaultStr) {
if (s == null) {
return defaultStr;
} else {
return s.ToString();
}
}
/// <summary>
/// 扩张方法 转换bool
/// </summary>
/// <returns></returns>
public static bool ToEBoolean(this object s) {
if (s == null) {
return false;
} else {
return Convert.ToBoolean(s);
}
}
/// <summary>
/// 字符串截取从第一位截取
/// </summary>
/// <returns></returns>
public static string ESubStart(this object s ,int length) {
string temp = s.ToEString();
if (temp.Length <= length) {
return temp;
} else {
return temp.Substring(0 ,length);
}
}
/// <summary>
/// 字符串截取从第一位截取
/// </summary>
/// <returns></returns>
public static string ESubEnd(this object s ,int length) {
string temp = s.ToEString();
if (temp.Length <= length) {
return temp;
} else {
return temp.Substring(temp.Length - length ,length);
}
}
/// <summary>
/// 判断字符串或对象是否为空或null
/// </summary>
/// <returns></returns>
public static bool IsNullOrEmpty(this object s) {
if (s == null) {
return true;
} else {
return string.IsNullOrEmpty(s.ToEString().Trim());
}
}
/// <summary>
/// 给前端展示的保留小数用
/// </summary>
/// <returns></returns>
public static string ToMoney(this decimal? s) {
if (s == null) {
return Decimal.Parse("0").ToString("f2");
} else {
return Decimal.Parse(s.ToEString()).ToString("f2");
}
}
public static string ToStringDigit(this object s,string x) {
if (s != null) {
decimal t = 0;
if (decimal.TryParse(s.ToString(), out t)) {
return x == "f2" ? t.ToString("f2") : t.ToString("0");
} else return s.ToString();
} else return "";
//return x == "f2" ? Decimal.Parse("0").ToString("f2") : "0";
}
/// <summary>
/// 给前端展示的保留小数用
/// </summary>
/// <returns></returns>
public static string ToMoney(this decimal s) {
return s.ToString("f2");
}
/// <summary>
/// 转换 int 默认为 0
/// </summary>
/// <param name="t"></param>
/// <returns></returns>
public static int ToEInt(this object t) {
if (t == null) {
return 0;
} else {
try {
return Convert.ToInt32(t);
} catch {
return 0;
}
}
}
public static long ToLong(this object t) {
if (t == null) {
return 0;
} else {
try {
return Convert.ToInt64(t);
} catch {
return 0;
}
}
}
/// <summary>
/// 转换 Short 默认为 0
/// </summary>
/// <param name="t"></param>
/// <returns></returns>
public static short ToEShort(this object t) {
if (t == null) {
return 0;
} else {
return Convert.ToInt16(t);
}
}
/// <summary>
/// 转换 byte 默认为 0
/// </summary>
/// <param name="t"></param>
/// <returns></returns>
public static byte ToEByte(this object t) {
if (t == null) {
return 0;
} else {
return Convert.ToByte(t.ToString());
}
}
/// <summary>
/// 转换 DateTime 默认为 DateTime.MinValue
/// </summary>
/// <param name="t"></param>
/// <returns></returns>
public static DateTime ToEDate(this object t) {
if (t == null) {
return DateTime.MinValue;
} else {
return DateTime.Parse(t.ToEString());
}
}
/// <summary>
/// 转换 DateTime 默认为 DateTime.MinValue
/// </summary>
/// <param name="t"></param>
/// <returns></returns>
public static string ToEShortDate(this object t) {
if (t == null) {
return DateTime.MinValue.ToString("yyyy-MM-dd");
} else {
return DateTime.Parse(t.ToEString()).ToString("yyyy-MM-dd");
}
}
/// <summary>
/// 转换 DateTime 默认为 DateTime.MinValue
/// </summary>
/// <param name="t"></param>
/// <returns></returns>
public static DateTime ToEDateFormat(this DateTime? t) {
return DateTime.Parse(t.ToEDate().ToString("yyyy-MM-dd HH:mm:ss"));
}
/// <summary>
/// 转换 Decimal 默认为 0;
/// </summary>
/// <param name="t"></param>
/// <returns></returns>
public static Decimal ToEDecimal(this object t) {
if (t == null) {
return 0;
} else {
try {
return decimal.Parse(t.ToEString());
} catch {
return 0;
}
}
}
/// <summary>
/// 转换 Double 默认为 0;
/// </summary>
/// <param name="t"></param>
/// <returns></returns>
public static Double ToEDouble(this object t) {
if (t == null) {
return 0;
} else {
try {
return double.Parse(t.ToEString());
} catch {
return 0;
}
}
}
/// <summary>
/// 转换 MD5加密 默认为 0;
/// </summary>
/// <param name="t"></param>
/// <returns></returns>
public static string ToEMD5(this object t) {
if (t == null) {
return null;
} else {
string input = t.ToEString();
return EncodingHelper.MD5Encrypt(input).ToUpper();
}
}
/// <summary>
/// 非法字符转换
/// </summary>
/// <param name="str"></param>
/// <returns></returns>
public static bool IsHasCheckVar(this object t) {
string input = t.ToEString().Trim();
string checkvar = "`";:%☆?!〈(&#";
foreach (char c in checkvar) {
if (input.Contains(c))
return true;
}
return false;
}
/// <summary>
/// 清除短信商认定的敏感词
/// 说明: 不同短信商可能规则不同,更换短信商时,这里可以对应调整。
/// </summary>
/// <param name="str"></param>
/// <returns></returns>
public static string FilterSensitiveWords(this object t) {
List<string> SensitiveWordsForReplace = new List<string>() { "移动" ,"独立" ,"礼" ,"特价" ,"上市" ,"居" ,"享受" ,"制服" ,"骗子" ,"生肖" ,"屌" ,"咪咪" ,"骚" ,"师傅" ,"【" ,"】" };
List<string> SensitiveWordsForSeprate = new List<string>() { "台湾" ,"代理" ,"大师" ,"广告" ,"黄色" ,"丝袜" ,"色男" ,"SB" ,"茉莉花" ,"花花公子" ,"发票" ,"三点" };
string input = t.ToEString().Trim();
foreach (string r in SensitiveWordsForReplace) {
input = input.Replace(r ,"");
}
foreach (string s in SensitiveWordsForReplace) {
var news = s.ToList();
news.Insert(1 ,' ');
input = input.Replace(s ,string.Join(" " ,news.ToArray()));
}
return input;
}
/// <summary>
/// 枚举转 ArrayList
/// </summary>
/// <param name="enumType"> typeof(枚举)</param>
/// <returns></returns>
public static IList ToList(this Type enumType) {
ArrayList list = new ArrayList();
foreach (int item in Enum.GetValues(enumType)) {
list.Add(Enum.GetName(enumType ,item));
}
return list;
}
/// <summary>
/// 枚举转 Dictionary
/// </summary>
/// <param name="enumType"></param>
/// <returns></returns>
public static Dictionary<string ,string> ToDictionary(this Type enumType) {
Dictionary<string ,string> list = new Dictionary<string ,string>();
foreach (int item in Enum.GetValues(enumType)) {
list.Add(Enum.GetName(enumType ,item) ,item.ToEString());
}
return list;
}
/// <summary>
/// 扩张方法 转换字符串默认为 ""
/// </summary>
/// <returns></returns>
public static string ToMaskString(this object s) {
string str = s.ToEString();
if (string.IsNullOrEmpty(str)) {
return "";
} else {
if (RegularValidateHelper.IsMobilePhoneNumber(str) && str.Length == 11) {
return str.Substring(0 ,3) + "****" + str.Substring(7 ,4);
} else {
if (str.Length == 2) {
return str.Substring(0 ,1) + GetMask(1);
}
if (str.Length > 2) {
return str.Substring(0 ,1) + GetMask(str.Length - 2) + str.Substring(str.Length - 1 ,1);
}
}
return s.ToString();
}
}
private static string GetMask(int length) {
string str = "";
for (int i = 0 ; i < length ; i++) {
str += "*";
}
return str;
}
/// <summary>
/// 验证是否特殊用户【内部用户】
/// </summary>
/// <param name="username"></param>
/// <returns></returns>
public static bool SpecialUser(string username) {
var ret = false;
var regStr = @"^(13[6-9]0000\d{4}|[a-z]+)$";
if (RegularValidateHelper.IsMatch(username ,regStr)) {
ret = true;
}
return ret;
}
}
HtmlHelper扩展
public static class HtmlActionLink {
#region 普通链接扩展方法
/// <summary>
/// 当前 controllerName 页面链接相关操
/// </summary>
/// <param name="htmlHelper"></param>
/// <param name="linkText"></param>
/// <param name="actionName"></param>
/// <param name="htmlAttributes"></param>
/// <returns></returns>
public static MvcHtmlString InkindActionLink(this HtmlHelper htmlHelper, string linkText, string actionName,
object htmlAttributes) {
return htmlHelper.InkindActionLink(linkText, actionName,
null, htmlAttributes);
}
/// <summary>
/// 无参数
/// </summary>
/// <param name="htmlHelper"></param>
/// <param name="linkText"></param>
/// <param name="actionName"></param>
/// <param name="controllerName"></param>
/// <param name="htmlAttributes"></param>
/// <returns></returns>
public static MvcHtmlString InkindActionLink(this HtmlHelper htmlHelper, string linkText, string actionName,
string controllerName, object htmlAttributes) {
return htmlHelper.InkindActionLink(linkText, actionName, controllerName, null, htmlAttributes);
}
/// <summary>
/// 带 地址参数
/// </summary>
/// <param name="htmlHelper"></param>
/// <param name="linkText"></param>
/// <param name="actionName"></param>
/// <param name="routeValues"></param>
/// <param name="htmlAttributes"></param>
/// <returns></returns>
public static MvcHtmlString InkindActionLink(this HtmlHelper htmlHelper, string linkText, string actionName,
object routeValues, object htmlAttributes) {
return htmlHelper.InkindActionLink(linkText, actionName, null, routeValues, htmlAttributes);
}
/// <summary>
/// 新 controllerName 页面链接
/// </summary>
/// <param name="htmlHelper"></param>
/// <param name="linkText">@不编码</param>
/// <param name="actionName"></param>
/// <param name="controllerName"></param>
/// <param name="htmlAttributes"></param>
/// <returns></returns>
public static MvcHtmlString InkindActionLink(this HtmlHelper htmlHelper, string linkText, string actionName,
string controllerName, object routeValues, object htmlAttributes) {
if (!CheckPower(actionName, controllerName)) {
return new MvcHtmlString("");
}
linkText = linkText.ToEString().Trim();
string htmlText = "";
if (linkText.StartsWith("@")) {
htmlText = "@@@@";
}
else {
htmlText = linkText;
}
if (htmlAttributes != null && htmlAttributes.ToString().Contains("replacehref")) {
actionName = string.Empty;
controllerName = string.Empty;
}
if (string.IsNullOrEmpty(htmlText)) {
htmlText = " ";
}
string htmlString = htmlHelper.ActionLink(htmlText, actionName,
controllerName, routeValues, htmlAttributes).ToHtmlString().ToString()
.Replace("dataopeniframe", "data-open-iframe");
if (linkText.StartsWith("@")) {
htmlString = htmlString.Replace("@@@@", linkText.Substring(1, linkText.Length - 1));
}
if (htmlAttributes != null && htmlAttributes.ToString().Contains("replacehref")) {
htmlString = htmlString.Replace("href=\"/\"", string.Empty);
htmlString = htmlString.Replace("replacehref", "href");
}
return new MvcHtmlString(htmlString);
}
#endregion
/// <summary>
/// 判断权限
/// </summary>
/// <returns></returns>
public static bool CheckPower(string actionName, string controllerName) {
if (string.IsNullOrEmpty(controllerName)) {
string redirectOnSuccess = HttpContext.Current.Request.Url.AbsolutePath;
string[] localPathArr = redirectOnSuccess.Split('/');
if (localPathArr.Length - 2 > 0) {
controllerName = localPathArr[localPathArr.Length - 2];
}
else {
controllerName = "Home";
}
}
//登录默认就可以拥有的权限
List<string> powerlist = new List<string> {
"account/logout",
"home/index",
"statistic/getsalescount",
"user/deltaobaoshopbind",
"good/taobaodatadatail",
"good/gettaobaogoods",
"good/listdata",
"site/getalltitle",
"finance/addmoneyeditadds",
"notice/sendmessage",
"marketing/upLoad",
//"order/getorderlog", //订单详情页面下部日志用ajax加载
"train/gettraincurriculumforselectlist", //店宝宝培训 课程下拉框数据
"train/gettraincurriculumseriesforselectlist",//店宝宝培训 系列下拉框数据
"site/getmodulebytitle",
"home/upload",
//智齿
"customerservice/getsobotacount",
"customerservice/getuserinfo"
};
VUser user = HttpContext.Current.Session["userinfo"] as VUser;
if (user == null) {
return false;
}
else {
//pass 登录相关
if (powerlist.Where(s => s.ToLower() == (controllerName + "/" + actionName).ToLower()).Any()) {
return true;
}
List<VUserPowerList> powerList = user.PowerList;
if (powerList == null) {
return false;
}
string roules = (controllerName + "/" + actionName).ToLower().Trim();
//没有权限直接不反馈任何东西
return powerList.Where(p => p.Roules == roules && p.Roules != null).Any();
}
}
#region ajax 链接
/// <summary>
///
/// </summary>
/// <param name="ajaxHelper"></param>
/// <param name="linkText"></param>
/// <param name="actionName"></param>
/// <param name="controllerName"></param>
/// <param name="ajaxOptions"></param>
/// <param name="htmlAttributes"></param>
/// <returns></returns>
public static MvcHtmlString InkindActionLink(this AjaxHelper ajaxHelper, string linkText, string actionName,
string controllerName, AjaxOptions ajaxOptions, object htmlAttributes) {
return ajaxHelper.InkindActionLink(linkText, actionName, controllerName, null, ajaxOptions, htmlAttributes);
}
/// <summary>
///
/// </summary>
/// <param name="ajaxHelper"></param>
/// <param name="linkText">@不编码</param>
/// <param name="actionName"></param>
/// <param name="ajaxOptions"></param>
/// <param name="htmlAttributes"></param>
/// <returns></returns>
public static MvcHtmlString InkindActionLink(this AjaxHelper ajaxHelper, string linkText, string actionName,
AjaxOptions ajaxOptions, object htmlAttributes) {
return ajaxHelper.InkindActionLink(linkText, actionName, "", ajaxOptions, htmlAttributes);
}
/// <summary>
///
/// </summary>
/// <param name="ajaxHelper"></param>
/// <param name="linkText">@不编码</param>
/// <param name="actionName"></param>
/// <param name="ajaxOptions"></param>
/// <returns></returns>
public static MvcHtmlString InkindActionLink(this AjaxHelper ajaxHelper, string linkText, string actionName,
AjaxOptions ajaxOptions) {
return ajaxHelper.InkindActionLink(linkText, actionName, "", ajaxOptions, null);
}
/// <summary>
///
/// </summary>
/// <param name="ajaxHelper"></param>
/// <param name="linkText">@不编码</param>
/// <param name="actionName"></param>
/// <param name="controllerName"></param>
/// <param name="ajaxOptions"></param>
/// <returns></returns>
public static MvcHtmlString InkindActionLink(this AjaxHelper ajaxHelper, string linkText, string actionName,
string controllerName, AjaxOptions ajaxOptions) {
return ajaxHelper.InkindActionLink(linkText, actionName, controllerName, ajaxOptions, null);
}
/// <summary>
///
/// </summary>
/// <param name="ajaxHelper"></param>
/// <param name="linkText"></param>
/// <param name="actionName"></param>
/// <param name="routeValues"></param>
/// <param name="ajaxOptions"></param>
/// <param name="htmlAttributes"></param>
/// <returns></returns>
public static MvcHtmlString InkindActionLink(this AjaxHelper ajaxHelper, string linkText, string actionName,
object routeValues, AjaxOptions ajaxOptions, object htmlAttributes) {
return ajaxHelper.InkindActionLink(linkText, actionName, null, routeValues, ajaxOptions, htmlAttributes);
}
/// <summary>
/// 最全的重载
/// </summary>
/// <param name="ajaxHelper"></param>
/// <param name="linkText"></param>
/// <param name="actionName"></param>
/// <param name="controllerName"></param>
/// <param name="ajaxOptions"></param>
/// <param name="htmlAttributes"></param>
/// <returns></returns>
public static MvcHtmlString InkindActionLink(this AjaxHelper ajaxHelper, string linkText, string actionName,
string controllerName, object routeValues, AjaxOptions ajaxOptions, object htmlAttributes) {
if (!CheckPower(actionName, controllerName)) {
return new MvcHtmlString("");
}
linkText = linkText.ToEString().Trim();
string htmlText = "";
if (linkText.StartsWith("@")) {
htmlText = "@@@@";
}
else {
htmlText = linkText;
}
string htmlString = ajaxHelper.ActionLink(htmlText, actionName, controllerName, routeValues, ajaxOptions, htmlAttributes)
.ToHtmlString().ToString();
if (linkText.StartsWith("@")) {
htmlString = htmlString.Replace("@@@@", linkText.Substring(1, linkText.Length - 1));
}
return new MvcHtmlString(htmlString);
}
#endregion
}