Domanda

Non riesco a utilizzare AsEnumerable () su DataTable, sto usando C # 3 ma sto solo prendendo di mira il framework 2.0 (la funzionalità LINQ è fornita da LINQBridge ). Esiste un modo per rendere enumerabile DataTable senza usare Select ()?

bool isExisting = (bdsAttachments.DataSource as DataTable).Select().Any(xxx => (string)dr["filename"] == filename);

Aggiornamento:

Volevo che fosse così:

bool isExisting = (bdsAttachments.DataSource as DataTable).AsEnumerable().Any(xxx => (string)dr["filename"] == filename);

Ho capito che il metodo Select di DataTable restituisce una copia, sto pensando di usare AsEnumerable, il problema è che sto solo prendendo di mira il framework 2.0, System.Data.DataSetExtensions non è disponibile

A proposito, ho provato questo: http: / /cs.rthand.com/blogs/blog_with_righthand/archive/2006/01/15/284.aspx , ma presenta errori di compilazione.

È stato utile?

Soluzione

    public static IEnumerable<DataRow> EnumerateRows(this DataTable table)
    {
        foreach (var row in table.Rows)
        {
            yield return row;
        }
    }

Ti permette di chiamare:

bool isExisting = (bdsAttachments.DataSource as DataTable).EnumerateRows().Any(dr => (string)dr["filename"] == filename);

Altri suggerimenti

  1. IEnumerable<DataRow> rows = dataTable.AsEnumerable(); (System.Data.DataSetExtensions.dll)
  2. IEnumerable<DataRow> rows = dataTable.Rows.OfType<DataRow>(); (System.Core.dll)

Mantenere il proprio enumeratore rigorosamente 2.0:

public static IEnumerable<DataRow> getRows(DataTable table)
{
    foreach (DataRow row in table.Rows)
    {
        yield return row;
    }
}

Quindi chiama con linqbridge in questo modo:

bool isExisting = getRows(bdsAttachments.DataSource as DataTable).Any(row => (string)row["filename"] == filename);

Puoi provare a trasmettere DataTable come IEnumerable e iterare sul set:

//your data exists as a DataTable
DataTable dt = (DataTable)bdsAttachments.DataSource;
foreach (DataRow row in dt)
{
    if (row["filename"] == filename)
        return row;
}

Il foreach scorrerà l'elenco e la ricerca del nome file (suppongo che stai cercando il primo DataRow con quel nome file, non tutte le righe che corrispondono al nome file).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top