c# - Linq2SQL - 使用反射选择项目

标签 c# .net linq-to-sql reflection

我正在尝试使用 Linq2SQL 加载实体集合。问题是,我不知道实体是什么,IList<object> .我曾尝试使用反射来选择它们,但是当我进行选择时出现内存不足错误,我认为是因为上下文无法解析我的表达式,并且正在从数据库中加载所有内容。

如果有人对此有任何建议,或者有其他方法可以做我想做的事情,请告诉我。

foreach (object entity in requiredEntities)
{
   Type entityType = entity.GetType();
   IQueryable<object> entityTable = (IQueryable<object>)dataContext.GetTable(entityType);               

   // grab the objects primary key field
   var pkeyField = entityType.GetProperties().SingleOrDefault(p =>
                   p.GetCustomAttributes(typeof(System.Data.Linq.Mapping.ColumnAttribute),true)
                   .Cast<System.Data.Linq.Mapping.ColumnAttribute>() 
                   .Any(attrib => attrib.IsPrimaryKey));

   object pkeyValue = pkeyField.GetValue(entity,null);

   Func<object,bool> primaryKeySelector = o => pkeyField.GetValue(o,null) == pkeyValue;

   // crash here, out of memory exception
   object result = entityTable.Where(primaryKeySelector).SingleOrDefault();
}

最佳答案

通过使用委托(delegate),您强制它使用 LINQ-to-Objects,这就是它耗尽内存的原因。您需要做的是构建一个 Expression。同样,使用属性也是不好的做法,因为这不是 LINQ-to-SQL 支持的唯一模型;最好查看 dataContext.Mapping.GetMetaType(entityType) 以获取主键。

如果你有 4.0,下面的应该可以工作:

var entityType = typeof(User);
var metaType = dataContext.Mapping.GetMetaType(entityType);
var member = metaType.DataMembers.Single(m => m.IsPrimaryKey).Member;

var param = Expression.Parameter(entityType);
var body = Expression.Equal(Expression.MakeMemberAccess(param, member),
    Expression.MakeMemberAccess(Expression.Constant(entity), member));
dynamic table = dataContext.GetTable(entityType);

object result = Cheeky(table, body, param);

static T Cheeky<T>(ITable<T> source, Expression body, ParameterExpression param)
    where T : class
{
    var predicate = Expression.Lambda<Func<T, bool>>(body, param);
    return source.SingleOrDefault(predicate);
}

关于c# - Linq2SQL - 使用反射选择项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6595406/

相关文章:

.net - ToString() 是否被编译器优化?

sql - 需要帮助创建 linq 选择

c# - Entity Framework - 在 Linq 中处理空值

c# - 在内存数据缓存中提高 .Net 应用程序的性能

c# - C# 中的 Gif 动画文件的帧率低于应有的帧率

c# - 按列和行或任何替代方式引用 SQLDataReader 中的数据

c# - StringBuilder 还是 XMLDocument?

c# - 无法添加在 Xamarin PCL 项目中使用的程序集 System.Collections.Concurrent

c# - 字符串格式 : negative/positive floating point numbers

c# - 切换不同的app.config