我的实体中有一个包含370列的表!此外,我有一个字符串数组,在运行时之前是未知的(来自网站)。
e.g:
string [] columns = {"column1", "column2", "column3"}
我如何向我的实体发出一个linq,只给出了给定列的结果?
我搜索了几个小时,但直到现在还没有提出任何建议?
答案 0 :(得分:0)
这不是Linq-to-Entities可以做的事情。您需要能够在代码中声明列。
更好的方法是使用数组中的列名在Sql中创建查询,并使用Dapper之类的内容将结果映射到对象。
答案 1 :(得分:0)
您可以在Delegate中实例化一个ExpandoObject,并使用Reflection获取传入数组中指定的列。
以下内容:
List<IDictionary<String, Object>> List = Context.Row_Type.Select(delegate(Row_Type Row) {
IDictionary<String, Object> Out = new ExpandoObject() as IDictionary<String, Object>;
PropertyInfo[] PIs = Row.GetType().GetProperties();
foreach(PropertyInfo PI in PIs) {
if(PI.GetIndexParameters().Length == 0) {
Out.Add(PI.Name, PI.GetValue(Row));
}
}
return Out;
}).ToList();
将返回List&lt; IDictionary的&LT;字符串,对象&gt;&gt;使用所有属性,返回所需的列,只能通过PI.Name:
进行区分 if(PI.Name == "Desired column"){ // Or Array index
// Add to Out:
Out.Add( PI.Name, PI.GetValue(Row) )
}
答案 2 :(得分:0)
我猜你真的不想返回一个包含未知列名的类。列名和值的字典是否适合您?您的查询仍然需要检索所有列,但您只能返回您关注的列。
string [] columns = {"column1", "column2", "column3"}
var entity = GetEntity();
var dictionary = columns.ToDictionary(c => c, c => entity.GetType().GetProperty(c).GetValue(entity));
或者,如果你有一个集合......
var entities = GetEntities();
var results = entities
.Select(e => columns.ToDictionary(c => c, c => e.GetType().GetProperty(c).GetValue(e)));