我正在打破这个问题并决定与你分享我的问题 我想从几个表创建一个匿名选择,其中一些可能包含多个结果。我想将这些结果连接成一个字符串 我做了这样的事情:
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
答案 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>
属性和只读属性的某些基类来处理字符串的串联?