关于Nullable类型转换 关于Nullable和数据库实体之间的转换,参照:http://www.itstrike.cn/Question/CSharp-using-reflection-to-determine-whether-a-type-is-Nullable-access-to-it-at-the-same-time-the-root-type 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 Type t = this.GetType(); if (t.BaseType.GetGenericTypeDefinition() == typeof (Nullable<>)) { } 这个和我网上查的一样啊 如果type是int?就返回int类型调用 Expression.Equal就会异常这是代码 protected IQueryable<T> WhereList<T>(IQueryable<T> query, string name, string value) { PropertyInfo sortProperty = null; if (!string.IsNullOrEmpty(name)) { sortProperty = typeof(T).GetProperty(name, BindingFlags.Public | BindingFlags.Instance | BindingFlags.IgnoreCase); } if (string.IsNullOrEmpty(value)) return query; if (sortProperty == null) throw new Exception("对像上不存在" + sortProperty + "的字段"); ParameterExpression param = Expression.Parameter(typeof(T), "x"); Expression left = Expression.Property(param, typeof(T).GetProperty(name)); Type tp = typeof(T).GetProperty(name).PropertyType; //判断类型是否为泛型,因为nullable是泛型类, if (tp.IsGenericType && //判断是否为nullable泛型类 tp.GetGenericTypeDefinition().Equals(typeof(Nullable<>))) { //如果tp为nullable类,声明一个NullableConverter类,该类提供从Nullable类到基础基元类型的转换 NullableConverter nullableConverter = new NullableConverter(tp); //将tp转换为nullable对的基础基元类型 tp = nullableConverter.UnderlyingType; } Expression right = Expression.Constant(Convert.ChangeType(value, tp)); Expression filter = Expression.Equal(left, right); Expression pred = Expression.Lambda(filter, param); Expression expr = Expression.Call(typeof(Queryable), "Where", new Type[] { typeof(T) }, Expression.Constant(query), pred); query = query.Provider.CreateQuery<T>(expr); return query; } 看到你的代码,我清楚了,那我给你的建议是不要这么去做,这样做涉及装箱拆箱,会降低效率。正确的做法应该是 protected IQueryable<T> WhereList<T>(IQueryable<T> query, string name, T value)这是一个生成查询条件的方法,在你调用或者别人调用的时候已经知道数据库类型,就没有必要再把传入的值转换为String再传入,直接传同类型的值进来即可。不要把已经的变成未知来处理,这样是不合理的。ORM不能那个这样去做的,这样做吃力不讨好。 name 和 value都是前台传过来的集合 可能有多个 都是string类型我就是想动态生成查询条件 不用每加一个查询条件就多加一个判断 要不然直接list.where就行了 也用不着这个方法了 已自行解决 if (tp.IsGenericType && //判断是否为nullable泛型类 tp.GetGenericTypeDefinition().Equals(typeof(Nullable<>))) { right = Expression.Constant(Convert.ChangeType(value, tp.GetGenericArguments()[0])); right = Expression.Convert(right, tp); } else { right = Expression.Constant(Convert.ChangeType(value, tp)); } 这样啊,我写的ORM的避免了这个问题,不使用Linq来做。那你这边这样写就行了。 object resultvalue; //判断类型是否为泛型,因为nullable是泛型类, if (tp.IsGenericType && //判断是否为nullable泛型类 tp.GetGenericTypeDefinition().Equals(typeof(Nullable<>))) { //如果tp为nullable类,声明一个NullableConverter类,该类提供从Nullable类到基础基元类型的转换 NullableConverter nullableConverter = new NullableConverter(tp); resultvalue = nullableConverter.ConvertFromString(value); } else { resultvalue = Convert.ChangeType(value, tp); } object resultvalue; //判断类型是否为泛型,因为nullable是泛型类, if (tp.IsGenericType && //判断是否为nullable泛型类 tp.GetGenericTypeDefinition().Equals(typeof(Nullable<>))) { //如果tp为nullable类,声明一个NullableConverter类,该类提供从Nullable类到基础基元类型的转换 NullableConverter nullableConverter = new NullableConverter(tp); resultvalue = nullableConverter.ConvertFromString(value); } else { resultvalue = Convert.ChangeType(value, tp); } 引用点错。object resultvalue; //判断类型是否为泛型,因为nullable是泛型类, if (tp.IsGenericType && //判断是否为nullable泛型类 tp.GetGenericTypeDefinition().Equals(typeof(Nullable<>))) { //如果tp为nullable类,声明一个NullableConverter类,该类提供从Nullable类到基础基元类型的转换 NullableConverter nullableConverter = new NullableConverter(tp); resultvalue = nullableConverter.ConvertFromString(value); } else { resultvalue = Convert.ChangeType(value, tp); } Expression right = Expression.Constant(resultvalue); C# winform下利用timer控件怎么判断数据库是否有数据更新 [分享][开源]uoLib - .Net 项目基础类库升级到3.0.0版 关闭一个窗体,如何让它彻底从内存中清除,而又不关闭本应用程序的其它窗口,也不退出应用程序。 请教一个局域网程序的架构问题 windos文本编辑器的问题~看代码 关于地址栏参数乱码问题 这样的察询有问题吗? 初学C#求助 两段代码为什么第一段无法取到值,请帮忙看看 C#和oracle程序的运行 请教一个和右连接有关的问题 【征集】编写一个 类似病历编辑器 有没有好的思路
Type t = this.GetType();
if (t.BaseType.GetGenericTypeDefinition() == typeof (Nullable<>))
{ }
这个和我网上查的一样啊 如果type是int?就返回int类型
调用 Expression.Equal就会异常这是代码 protected IQueryable<T> WhereList<T>(IQueryable<T> query, string name, string value)
{
PropertyInfo sortProperty = null;
if (!string.IsNullOrEmpty(name))
{
sortProperty = typeof(T).GetProperty(name, BindingFlags.Public | BindingFlags.Instance | BindingFlags.IgnoreCase);
}
if (string.IsNullOrEmpty(value))
return query;
if (sortProperty == null)
throw new Exception("对像上不存在" + sortProperty + "的字段");
ParameterExpression param = Expression.Parameter(typeof(T), "x");
Expression left = Expression.Property(param, typeof(T).GetProperty(name));
Type tp = typeof(T).GetProperty(name).PropertyType;
//判断类型是否为泛型,因为nullable是泛型类,
if (tp.IsGenericType &&
//判断是否为nullable泛型类
tp.GetGenericTypeDefinition().Equals(typeof(Nullable<>)))
{
//如果tp为nullable类,声明一个NullableConverter类,该类提供从Nullable类到基础基元类型的转换
NullableConverter nullableConverter = new NullableConverter(tp);
//将tp转换为nullable对的基础基元类型
tp = nullableConverter.UnderlyingType;
}
Expression right = Expression.Constant(Convert.ChangeType(value, tp));
Expression filter = Expression.Equal(left, right);
Expression pred = Expression.Lambda(filter, param);
Expression expr = Expression.Call(typeof(Queryable), "Where",
new Type[] { typeof(T) },
Expression.Constant(query), pred);
query = query.Provider.CreateQuery<T>(expr);
return query;
}
正确的做法应该是 protected IQueryable<T> WhereList<T>(IQueryable<T> query, string name, T value)
这是一个生成查询条件的方法,在你调用或者别人调用的时候已经知道数据库类型,就没有必要再把传入的值转换为String再传入,直接传同类型的值进来即可。不要把已经的变成未知来处理,这样是不合理的。ORM不能那个这样去做的,这样做吃力不讨好。
我就是想动态生成查询条件 不用每加一个查询条件就多加一个判断
要不然直接list.where就行了 也用不着这个方法了
//判断是否为nullable泛型类
tp.GetGenericTypeDefinition().Equals(typeof(Nullable<>)))
{
right = Expression.Constant(Convert.ChangeType(value, tp.GetGenericArguments()[0]));
right = Expression.Convert(right, tp);
}
else
{
right = Expression.Constant(Convert.ChangeType(value, tp));
}
那你这边这样写就行了。 object resultvalue;
//判断类型是否为泛型,因为nullable是泛型类,
if (tp.IsGenericType &&
//判断是否为nullable泛型类
tp.GetGenericTypeDefinition().Equals(typeof(Nullable<>)))
{
//如果tp为nullable类,声明一个NullableConverter类,该类提供从Nullable类到基础基元类型的转换
NullableConverter nullableConverter = new NullableConverter(tp);
resultvalue = nullableConverter.ConvertFromString(value);
}
else
{
resultvalue = Convert.ChangeType(value, tp);
}
//判断类型是否为泛型,因为nullable是泛型类,
if (tp.IsGenericType &&
//判断是否为nullable泛型类
tp.GetGenericTypeDefinition().Equals(typeof(Nullable<>)))
{
//如果tp为nullable类,声明一个NullableConverter类,该类提供从Nullable类到基础基元类型的转换
NullableConverter nullableConverter = new NullableConverter(tp);
resultvalue = nullableConverter.ConvertFromString(value);
}
else
{
resultvalue = Convert.ChangeType(value, tp);
}
//判断类型是否为泛型,因为nullable是泛型类,
if (tp.IsGenericType &&
//判断是否为nullable泛型类
tp.GetGenericTypeDefinition().Equals(typeof(Nullable<>)))
{
//如果tp为nullable类,声明一个NullableConverter类,该类提供从Nullable类到基础基元类型的转换
NullableConverter nullableConverter = new NullableConverter(tp);
resultvalue = nullableConverter.ConvertFromString(value);
}
else
{
resultvalue = Convert.ChangeType(value, tp);
}
Expression right = Expression.Constant(resultvalue);