Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/308.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# 使用linq在字段上迭代_C#_Linq_Linqpad - Fatal编程技术网

C# 使用linq在字段上迭代

C# 使用linq在字段上迭代,c#,linq,linqpad,C#,Linq,Linqpad,我有一个包含很多列的表,希望将所有字符串字段合并在一行中,这样我就可以在其中执行搜索,而无需依次将搜索字符串与每个字段进行比较 如何在不显式说明每个列名的情况下遍历该行 ColumnA | ColumnB | ... | ColumnN --------------------------------- A | B | ... | N 我想得到AB…N的结果 这就是我目前所拥有的 string searchString = "text"; var searc

我有一个包含很多列的表,希望将所有字符串字段合并在一行中,这样我就可以在其中执行搜索,而无需依次将搜索字符串与每个字段进行比较

如何在不显式说明每个列名的情况下遍历该行

ColumnA | ColumnB | ... | ColumnN
---------------------------------
   A    |    B    | ... |    N   
我想得到AB…N的结果

这就是我目前所拥有的

string searchString = "text";
var searchCandidate = ATable.Where( ... condition ...); // IQueryable<ATable>
searchCandidate. // what goes here to loop through all fields ?
string searchString=“text”;
var searchCandidate=ATable.Where(…条件…)//易变的
搜索候选人这里是什么循环通过所有字段的?
如果将每一行作为列的值数组,则可以使用。
DataTable就是这种情况

尝试以下方法:

    private void Form1_Load(object sender, EventArgs e)
    {
        DataTable dt = new DataTable();
        dt.Columns.Add(new DataColumn { DataType = typeof(int), ColumnName = "A" });
        dt.Columns.Add(new DataColumn { DataType = typeof(int), ColumnName = "b" });
        dt.Columns.Add(new DataColumn { DataType = typeof(string), ColumnName = "c" });
        DataRow r;
        for (int i=0;i<=5 ;i++)
        {
            r = dt.NewRow();
            r["A"] = i;
            r["b"] = i + 2;
            r["c"] = i.ToString();
            dt.Rows.Add(r);

        }
        var query = from DataRow row in dt.Rows.Cast<DataRow>().ToList()
                    let textUnion = GetFields(row)
                    select new { textUnion };
        dataGridView1.DataSource = query.ToList();

    }
    string GetFields(DataRow row)
    {
        StringBuilder retValue=new StringBuilder();

        for (int i = 0; i < row.ItemArray.Length;i++ )
        {
            retValue.Append(Convert.ToString(row[i]));
        }

        return retValue.ToString();
    }
private void Form1\u加载(对象发送方,事件参数e)
{
DataTable dt=新的DataTable();
Add(newdatacolumn{DataType=typeof(int),ColumnName=“A”});
Add(newdatacolumn{DataType=typeof(int),ColumnName=“b”});
Add(newdatacolumn{DataType=typeof(string),ColumnName=“c”});
数据行r;

对于(int i=0;i,您可以通过构建表达式树编写这样的方法,如下所示:

Expression<Func<T, bool>> AnyColumnContains<T> (string value)
{
    var p = Expression.Parameter (typeof (T), "entity");

    var fieldAccessors = typeof (T)
        .GetFields()
        .Where (f => f.FieldType == typeof (string))
        .Select (f => Expression.Field (p, f))
        .ToArray();

    var fieldArray = Expression.NewArrayInit (typeof (string), fieldAccessors); 

    var concatCall = Expression.Call (typeof (string).GetMethod (
        "Concat", new[] { typeof (string[]) }), fieldArray);

    var contains = Expression.Call (
        concatCall, 
        typeof (string).GetMethod ("Contains", new[] { typeof (string) } ),
        Expression.Constant (value));

    return Expression.Lambda<Func<T, bool>> (contains, p);
}
SQL翻译:

Addresses
   .Where (
      entity => 
         String
            .Concat (new String[] { entity.AddressLine1, entity.AddressLine2,
                                    entity.City, entity.PostalCode } )
            .Contains ("Seattle")
   )
-- Region Parameters
DECLARE @p0 NVarChar(1000) = '%Seattle%'
-- EndRegion
SELECT [t0].[AddressID], [t0].[AddressLine1], [t0].[AddressLine2], [t0].[City],
       [t0].[StateProvinceID], [t0].[PostalCode], [t0].[rowguid] AS [Rowguid],
       [t0].[ModifiedDate]
FROM [Person].[Address] AS [t0]
WHERE ((([t0].[AddressLine1] + [t0].[AddressLine2]) + [t0].[City]) + [t0].[PostalCode])
      LIKE @p0

请显示您当前拥有的代码。表在哪种数据结构中?不确定我是否正确理解您的意思,但我已在q中添加了一些信息。从什么上下文是
ATable
?LINQ2SQL?EF?A
DataTable
?…?它是linq to sql,linqpad显示的数据类型是System.data.linq.table。然后您就出局了如果表示实体(=行)的类不公开列值数组…我只使用聚合函数在多个不同的行上迭代一个字段,可以说是一列。如何在一行上迭代?还是在一行中迭代多个字段?@Joe:正如我在对您的问题的评论中所说的,这只有在每行将其值公开为数组的情况下才有可能。h嗯…问题是,我的不是datatable。它的类型是System.Linq.IQueryable。我不确定它是如何声明的,我正在使用linqpad,它在内部创建对象。我只是使用它生成的linqtosql表。这肯定是在正确的路径上,我仍然需要解决如何处理空字段和非字符串字段,但这是家庭作业,所以我可以n学习如何使用表达式树。谢谢joe!:)
-- Region Parameters
DECLARE @p0 NVarChar(1000) = '%Seattle%'
-- EndRegion
SELECT [t0].[AddressID], [t0].[AddressLine1], [t0].[AddressLine2], [t0].[City],
       [t0].[StateProvinceID], [t0].[PostalCode], [t0].[rowguid] AS [Rowguid],
       [t0].[ModifiedDate]
FROM [Person].[Address] AS [t0]
WHERE ((([t0].[AddressLine1] + [t0].[AddressLine2]) + [t0].[City]) + [t0].[PostalCode])
      LIKE @p0