Search code examples
c#.netlinqlinq-to-dataset

Specifying return rows in LINQ2DataSet


I have a requirement to extract a distinct subset of rows from a DataTable, and thought LINQ2DataSets may be a useful and clean way to do this, however it appears that it is not possible to simply identify return rows from a LINQ2DS query as follows

var result = from r in fips.AsEnumerable() select
r.Field<string>("FACILITY_PROCESS_SUB_GROUP_CODE"),
r.Field<string>("PROCESS_SUB_GROUP_NAME"),
r.Field<string>("...

as I start getting errors after the first comma.

Is this a correct assumption, and how would I get around it to return a subset of columns from the dataset that I can apply a Distinct() method to?


Solution

  • You forgot the new statement and field names:

    var result = from r 
        in fips.AsEnumerable() 
        select new
        {
            FacProcess = r.Field<string>("FACILITY_PROCESS_SUB_GROUP_CODE"),
            GroupName = r.Field<string>("PROCESS_SUB_GROUP_NAME"),
            Item3 = r.Field<string>("Item3")
        };
    

    You can also explicitly declare that you are going to use a type:

    var result = from r 
        in fips.AsEnumerable() 
        select new MyType("InitClassParams") 
        {
            FacProcess = r.Field<string>("FACILITY_PROCESS_SUB_GROUP_CODE"),
            GroupName = r.Field<string>("PROCESS_SUB_GROUP_NAME"),
            Item3 = r.Field<string>("Item3")
        };
    

    Scott Guthrie (VP Developer Devision, Microsoft) has some good info about LINQ (he talks about LINQ to SQL, but most of it applies regardless).

    Then apply the distinct clause:

    var result = from r 
        in fips.AsEnumerable() 
        select new
        {
            FacProcess = r.Field<string>("FACILITY_PROCESS_SUB_GROUP_CODE"),
            GroupName = r.Field<string>("PROCESS_SUB_GROUP_NAME"),
            Item3 = r.Field<string>("Item3")
        }
        distinct;
    

    Then put it to a list or iterate over it. Nothing will be selected/distincted/etc until something like on of the following is run:

    var list = result.ToList()
    foreach(var item in result) {}