Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用表达式树添加新的lambda表达式_C#_Sql Server_Linq_Lambda_Expression Trees - Fatal编程技术网

C# 使用表达式树添加新的lambda表达式

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

我已经在这里和网上看了很多帖子,但似乎没有一篇有帮助

我有一个大约有200万条记录的表,它有200多列

一个简单的web服务允许用户从表中提取特定数量的列,用户可以选择要提取的列

结果需要是由逗号分隔的值组成的字符串,因此我的查询需要提取请求的列并返回连接字符串

我已经使用ADO.NET和纯SQL查询完成了这项工作,它工作得很好,但是我被要求在实体框架中完成这项工作

这是我已经做过的事情

我以字符串数组的形式获取请求的列列表

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…:-)非常感谢你的帮助