C# 使用表达式树添加新的lambda表达式
我已经在这里和网上看了很多帖子,但似乎没有一篇有帮助 我有一个大约有200万条记录的表,它有200多列 一个简单的web服务允许用户从表中提取特定数量的列,用户可以选择要提取的列 结果需要是由逗号分隔的值组成的字符串,因此我的查询需要提取请求的列并返回连接字符串 我已经使用ADO.NET和纯SQL查询完成了这项工作,它工作得很好,但是我被要求在实体框架中完成这项工作 这是我已经做过的事情 我以字符串数组的形式获取请求的列列表C# 使用表达式树添加新的lambda表达式,c#,sql-server,linq,lambda,expression-trees,C#,Sql Server,Linq,Lambda,Expression Trees,我已经在这里和网上看了很多帖子,但似乎没有一篇有帮助 我有一个大约有200万条记录的表,它有200多列 一个简单的web服务允许用户从表中提取特定数量的列,用户可以选择要提取的列 结果需要是由逗号分隔的值组成的字符串,因此我的查询需要提取请求的列并返回连接字符串 我已经使用ADO.NET和纯SQL查询完成了这项工作,它工作得很好,但是我被要求在实体框架中完成这项工作 这是我已经做过的事情 我以字符串数组的形式获取请求的列列表 List<string> valueList = new
List<string> valueList = new List<string>();
using (var ctx = new DataEntities1())
{
var query = ctx.myTable.Where(x => x.pcds == scode).SingleOrDefault();
foreach (var item in columnsArray)
{
valueList.Add(typeof(myTable).GetProperty(onsColumns[Convert.ToInt32(item)]).GetValue(query).ToString());
}
}
以下是我的问题,不确定这是否是最好的解决方案或想法,因此我在这里寻求帮助
var valueList2 = ctx.mytable.Where(x => x.pcds == comValue).Select(x => new{temp = x.column1 +", "+ x.column2}).Select(x => x.temp).ToList();
上面给出了由逗号分隔的两列组成的字符串,我只需要以某种方式将我的列名数组放入其中的lambda部分
我做了以下操作,但后来意识到它只适用于特定类型的类而不是匿名类,我也不知道如何将它用于多个列,而不使其变得如此复杂
var createdType = typeof(mytable);
var Param = Expression.Parameter(typeof(string), "pr");
var obj = Expression.New(createdType);
var ValueProperty = createdType.GetProperty("long");
var ValueAssignment = Expression.Bind(ValueProperty, Param);
var memberInit = Expression.MemberInit(obj, ValueAssignment);
var lm = Expression.Lambda<Func<string, mytable>>(memberInit, Param);
var createdType=typeof(mytable);
var Param=Expression.Parameter(typeof(string),“pr”);
var obj=Expression.New(createdType);
var ValueProperty=createdType.GetProperty(“long”);
var ValueAssignment=Expression.Bind(ValueProperty,Param);
var memberInit=Expression.memberInit(obj,ValueAssignment);
var lm=Expression.Lambda(memberInit,Param);
谢谢我正在使用()。遗憾的是,关于如何使用它的文档很少:-)在一个有趣的回飞棒效应中。回力棒效应是因为生成动态类的代码基于我的一个回答:-)剩下的代码看起来非常漂亮。。。需要注意的是,第二个库是第一个库的超集,因此您可以对第一个库应用许多示例:-)
我正在添加一些静态方法,以将动态Linq查询的结果转换为IEnumerable
。。。。示例代码:
using (var ctx = new Model1())
{
var result = ctx.MyTable
.Take(100)
.SimpleSelect(new[] { "ID", "Col1", "Col2" })
.ToObjectArray();
foreach (var row in result)
{
Console.WriteLine(string.Join(", ", row));
}
}
更复杂的例子:
var columnsNames = new[] { "SomeNullableInt32", "SomeNonNullableDateTimeColumn" };
// One for each column!
var formatters = new Func<object, string>[]
{
x => x != null ? x.ToString() : null,
x => ((DateTime)x).ToShortDateString()
};
var result = ctx.MyTable.Take(100).SimpleSelect(columnsNames).ToObjectArray();
foreach (var row in result)
{
var stringRow = new string[row.Length];
for (int i = 0; i < row.Length; i++)
{
stringRow[i] = formatters[i](row[i]);
}
Console.WriteLine(string.Join(", ", stringRow));
}
对于需要不同答案的人来说,这是一个简短而简单的答案,但根据我们与@xanatos的讨论,这不是最好的答案,因为它还返回了在添加到字符串列表之前需要删除的所有列
List<string> valueList = new List<string>();
using (var ctx = new DataEntities1())
{
var query = ctx.myTable.Where(x => x.pcds == scode).SingleOrDefault();
foreach (var item in columnsArray)
{
valueList.Add(typeof(myTable).GetProperty(onsColumns[Convert.ToInt32(item)]).GetValue(query).ToString());
}
}
List valueList=新列表();
使用(var ctx=new dataenties1())
{
var query=ctx.myTable.Where(x=>x.pcds==scode.SingleOrDefault();
foreach(列数组中的变量项)
{
valueList.Add(typeof(myTable).GetProperty(oncolumns[Convert.ToInt32(item)]).GetValue(query.ToString());
}
}
< />代码>因此,我考虑两种解决方案(字符串级联SQL侧和即时创建类型)糟糕的解决方案。遗憾的是,我不认为英孚有“返回一个IEnumerable
。这将是一个完美的解决方案类似的问题:@Jeremythonpson这并不是过度表达。。。EF是解决问题的错误工具。这是一个典型的问题,Ado.NET和DbDataReader
可以很好地工作。EF不是为做这些事情而建立的。使用NHibernate将非常简单(使用CriteriaAPI和到对象[]
的投影)。@Jeremythonpson这里没有“完美”的解决方案。。。我将发布一个可能的解决方案…@Farshad NHibernate是另一种ORM,类似于实体框架,但假设它是另一种宗教:-)非常感谢,这看起来像是至少在EF中的解决方案。那么,如果我可以访问SQL server,您会推荐哪一种方法或存储过程?@Farshad Aaaaah。。。我无法在bad1和bad2之间选择。。。在SP中通过eval
进行的动态查询是bad2。。。此代码为bad1…:-)非常感谢你的帮助