一开始我就知道有类似的问题,但是我的却有些不同。
我实现了一个功能,该功能允许用户选择他想查看的列。
我创建了一个存储过程,该存储过程从UserColumns
表中获取所有列名,创建一个动态sql查询,然后运行exec (@command)
查询。上面描述的功能效果很好,但是还有更多我无法通过这种方式处理的要求。
有TasksViewModel
:
public class TasksViewModel
{
public List<Dictionary<List<string>, List<List<object>>>> Tasks { get; set; }
public List<UserDefaultStatusesViewModel> UserStatuses { get; set; }
public List<ZgloszenieStatus> TaskStatuses { get; set; }
public TasksViewModel()
{
}
}
Tasks
由运行SELECT x,y,z... FROM table...
查询的存储过程填充。
我正在使用这种方法:
private static IEnumerable<Dictionary<List<string>, List<List<object>>>> Read(DbDataReader reader)
{
var dict = new Dictionary<List<string>, List<List<object>>>();
var cols = new List<string>();
for (int temp = 0; temp < reader.FieldCount; temp++)
{
cols.Add(reader.GetName(temp));
}
var items = new List<List<object>>();
while (reader.Read())
{
var tmp = new List<object>();
for (int i = 0; i < reader.FieldCount; i++)
{
tmp.Add(reader.GetValue(i));
}
items.Add(tmp);
}
dict.Add(cols, items);
foreach (var item in dict)
{
}
yield return dict;
}
我发现这太复杂了,但是目前我不知道是否还有其他方法可以实现。
我在应用程序中使用实体框架。
想象一下我正在使用List<Tasks>
而不是List<Dictionary<List<string>, List<List<object>>>>
。 Tasks
是数据库表。
public class Tasks
{
public int ID { get; set; }
public string Title { get; set; }
public string Description { get; set; }
public DateTime Date { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
}
用户只希望看到ID,Title,Description
列,因此UserColumns
表如下所示:
UserId | ColumnName
1 | ID
2 | Title
3 | Description
是否有一种使用Entity Framework根据List<Tasks>
表从UserColumns
中选择特定列的方法?
答案 0 :(得分:0)
您可以动态创建列列表的lambda
static Func<Tasks, Tasks> CreateSelect(string[] columns)
{
var parameterExpression = Expression.Parameter(typeof(Tasks), "p");
var newExpression = Expression.New(typeof(Tasks));
var bindings = columns.Select(o => o.Trim())
.Select(o =>
{
var pi = typeof(Tasks).GetProperty(o);
var memberExpression = Expression.Property(parameterExpression, pi);
return Expression.Bind(pi, memberExpression);
}
);
var memberInitExpression = Expression.MemberInit(newExpression, bindings);
var lambda = Expression.Lambda<Func<Tasks, Tasks>>(memberInitExpression, parameterExpression);
return lambda.Compile();
}
并基于该lambda (columnNameList数组是UserColumns表中的行)创建LINQ查询
static void Foo()
{
var columnNameList = new string[] { "ID", "Title", "Description" };
var tasksList = new List<Tasks>
{
new Tasks{ ID=1, Title="T1", FirstName="F1", LastName="L1", Description="D1", Date=DateTime.UtcNow },
new Tasks{ ID=2, Title="T2", FirstName="F2", LastName="L2", Description="D2", Date=DateTime.UtcNow }
};
var tasks = tasksList.Select(CreateSelect(columnNameList)).FirstOrDefault();
}
我希望能回答您的问题。