linq:使用select子句中的方法

时间:2011-06-19 14:33:53

标签: linq select aggregate

我正在打破这个问题并决定与你分享我的问题 我想从几个表创建一个匿名选择,其中一些可能包含多个结果。我想将这些结果连接成一个字符串 我做了这样的事情:

var resultTable = from item in dc.table
                    select new
                    {
                      id= item.id,
                      name= CreateString((from name in item.Ref_Items_Names
                               select name.Name).ToList()),
                    };

和CreateString()是:

private string CreateString(List<string> list)
{
  StringBuilder stringedData = new StringBuilder();
  for (int i = 0; i < list.Count; i++)
  {
    stringedData.Append(list[i] + ", ");
  }
  return stringedData.ToString();
}

我的意图是将“name”查询转换为list,然后将其发送到CreateString()以将其转换为一个长连接字符串。

我尝试使用.Aggregate((当前,下一个)=&gt;当前+“,”+下一个); 但是当我尝试将我的查询转换为DataTable时,如下所示:

public DataTable ToDataTable(Object query)
{
  DataTable dt = new DataTable();
  IDbCommand cmd = dc.GetCommand(query as IQueryable);
  SqlDataAdapter adapter = new SqlDataAdapter();
  adapter.SelectCommand = (SqlCommand)cmd;
  cmd.Connection.Open();
  adapter.Fill(dt);
  cmd.Connection.Close();
  return dt;
}

我遇到异常“dc.GetCommand()”无法理解使用Aggregate方法的查询 后来我甚至尝试使用这个简单的查询:

var resultTable = from itemin dc.table
                    select new
                    {
                      name = CreateString()
                    };

当CreateString()返回“success”时,没有任何内容插入“name” 为什么没有办法在select子句中使用方法? 谢谢 Yotam

2 个答案:

答案 0 :(得分:1)

LINQ to objects和LINQ to some-db-provider之间存在差异。一般来说,使用IQueryable时,除了提供商理解的方法外,您不能使用任何方法。

您可以做的是从数据库中检索数据,然后使用LINQ to objects进行格式化:

var data = from item in dc.table
           where /* some condition */
           select item;

var result = from item in data.AsEnumerable()
             select new
             {
                 name = SomeFunction(item)
             }

AsEnumerable()扩展方法强制使用LINQ对象进行处理。

答案 1 :(得分:0)

如果我错过解释你的问题,请原谅我。您似乎要做的是抽象您的select方法以便重用。如果是这种情况,您可以考虑使用lambda表达式进行投影。例如:

internal static class MyProjectors
{
    internal static Expression<Func<Object1, ReturnObject>> StringDataProjector
    {
        get
        {
            return d => new Object1()
            {
                //assignment here
            }
        }
    }
}

现在您可以选择数据集:

dc.Table.Select(MyProjectors.StringDataProjector)

对于连接逻辑,如何选择具有IEnumerable<string>属性和只读属性的某些基类来处理字符串的串联?