3
\$\begingroup\$

I am trying to get a row if it has the desired specific value, otherwise get the first or default:

dr =
   (from avTable in DAL.DataStore.DSet.Tables["Values1"].AsEnumerable()
    join pavTable in DAL.DataStore.DSet.Tables["Values2"].AsEnumerable()
        on avTable.Field<int>("PK") equals pavTable.Field<int>("FK_Value")
    where 
          pavTable.Field<int>("FKI_ProductAttribute") == Value2 &&
          avTable.Field<string>("Name") == "Specific Value"
    select avTable).FirstOrDefault() ??
    (from avTable in DAL.DataStore.DSet.Tables["Values1"].AsEnumerable()
     join pavTable in DAL.DataStore.DSet.Tables["Values2"].AsEnumerable()
     on avTable.Field<int>("PK") equals pavTable.Field<int>("FK_Value")
     where pavTable.Field<int>("FKI_ProductAttribute") == Value2
     select avTable).FirstOrDefault();

This smells. Is there a better way to do this?

I want to do something like this:

var dt =
   (from avTable in DAL.DataStore.DSet.Tables["Values1"].AsEnumerable()
    join pavTable in DAL.DataStore.DSet.Tables["Values2"].AsEnumerable()
        on avTable.Field<int>("PK") equals pavTable.Field<int>("FK_Value")
    where 
          pavTable.Field<int>("FKI_ProductAttribute") == Value2 &&
          avTable.Field<string>("Name") == "Specific Value"
    select avTable)

DataRow dr = dt.Select("PK = Specified value");
If(dr==null) dr = dt.FirstOrDefault();

and then do a select based on a specified value. If that is null, then grab the first or default. This seems to be more DRY, but is it more or less efficient?. Also, I have a hard time doing a select on the dt based on the specific value (lack of Linq expertise and Google prowess to find the answer I am looking for).

\$\endgroup\$
  • \$\begingroup\$ This is the way FirstOrDefault is supposed to work ...? I don't see anything that 'smells' ...unless there is some optimization to the query. But nothing I can really see ... \$\endgroup\$ – IAbstract Sep 2 '11 at 20:50
  • \$\begingroup\$ It just doesn't seem DRY to me, so I clarified what I am looking to do. \$\endgroup\$ – Ben Jones Sep 2 '11 at 21:10
  • \$\begingroup\$ 'But nothing I can really see ...' ...and then I put my glasses on ... \$\endgroup\$ – IAbstract Sep 2 '11 at 23:04
2
\$\begingroup\$

Will this work?

var dr= (from avTable in DAL.DataStore.DSet.Tables["Values1"].AsEnumerable()
         join pavTable in DAL.DataStore.DSet.Tables["Values2"].AsEnumerable()
             on avTable.Field<int>("PK") equals pavTable.Field<int>("FK_Value");
         where
             (pavTable.Field<int>("FKI_ProductAttribute") == Value2 &&
              avTable.Field<string>("Name") == "Specific Value") ||
              pavTable.Field<int>("FKI_ProductAttribute") == Value2
         select avTable)
        .FirstOrDefault();

I don't really have a way to test this, but I believe if the first part of the where clause criteria is met, the part after the || is skipped. If the first part returns no record then the second part is evaluated and will return a result ...or null.

\$\endgroup\$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.