-2

With this code:

UnitReportPairGenerateValsModel.GenerateVals generateVals =
    (from DataRow row in UnitReportPairGenerateValsDT.Rows
        select new UnitReportPairGenerateValsModel.GenerateVals
        {
            DayOfMonth = Convert.ToInt32(row["DayOfMonth"]),
            PatternOrdinal = row["PatternOrdinal"].ToString(),
            PatternDOW = row["PatternDOW"].ToString(),
            PatternInterval = row["PatternInterval"].ToString()
        });

...I get this compiler error:

Cannot implicitly convert type 'System.Collections.Generic.IEnumerable' to 'WebAppRptScheduler.Models.UnitReportPairGenerateValsModel.GenerateVals'. An explicit conversion exists (are you missing a cast?)

What do I need to cast this to to get it to work?

For more context, here is the entire Controller:

public class UnitReportPairGenerateValsController : Controller
{
    public JsonResult GetUnitReportPairGenerateVals(string unit, string report)
    {
        UnitReportPairGenerateValsModel model = new UnitReportPairGenerateValsModel();
        try
        {
            int rptId = SQL.GetReportIDForName(report);

            string qry = string.Format(SQL.UnitReportPairGenerateQuery, unit, rptId);
            DataTable UnitReportPairGenerateValsDT = SQL.ExecuteSQLReturnDataTable(
                qry,
                CommandType.Text,
                null
                );

            UnitReportPairGenerateValsModel.GenerateVals generateVals =
                (from DataRow row in UnitReportPairGenerateValsDT.Rows
                    select new UnitReportPairGenerateValsModel.GenerateVals
                    {
                        DayOfMonth = Convert.ToInt32(row["DayOfMonth"]),
                        PatternOrdinal = row["PatternOrdinal"].ToString(),
                        PatternDOW = row["PatternDOW"].ToString(),
                        PatternInterval = row["PatternInterval"].ToString()
                    });

            model.generatevals = generateVals; 
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
        return Json(model, JsonRequestBehavior.AllowGet);
    }   
}

...and the Model:

public class UnitReportPairGenerateValsModel
{
    public GenerateVals generatevals { get; set; }

    public class GenerateVals
    {
        public int DayOfMonth { get; set; }
        public string PatternOrdinal { get; set; } // such as "First", "Third", "Last" etc.
        public string PatternDOW { get; set; } // such as "Monday", "Tuesday" etc.
        public string PatternInterval { get; set; } // either "Week" or "Month"
    }
}

What do I need to do to allow my Controller method to pass back the four values queried?

B. Clay Shannon-B. Crow Raven
  • 8,547
  • 144
  • 472
  • 862

3 Answers3

3

If you are lazy make everything an array:

public class UnitReportPairGenerateValsModel
{
    public GenerateVals[] generatevals { get; set; }



UnitReportPairGenerateValsModel.GenerateVals[] generateVals =
    (from DataRow row in UnitReportPairGenerateValsDT.Rows
        select new UnitReportPairGenerateValsModel.GenerateVals
        {
            DayOfMonth = Convert.ToInt32(row["DayOfMonth"]),
            PatternOrdinal = row["PatternOrdinal"].ToString(),
            PatternDOW = row["PatternDOW"].ToString(),
            PatternInterval = row["PatternInterval"].ToString()
        }).ToArray();
Hogan
  • 69,564
  • 10
  • 76
  • 117
2

You're selecting a collection of GenerateVals. You'll need to either modify your variable to be an IEnumerable<GenerateVals> or modify your query to only return one item (e.g. by using .Single() or .First()).

Spivonious
  • 718
  • 7
  • 20
2

Change UnitReportPairGenerateValsModel.GenerateVals to IEnumerable<UnitReportPairGenerateValsModel.GenerateVals>. The select returns IEnumerable of the type specified for projection.

IEnumerable<UnitReportPairGenerateValsModel.GenerateVals> generateVals =
                (from DataRow row in UnitReportPairGenerateValsDT.Rows
                    select new UnitReportPairGenerateValsModel.GenerateVals
                    {
                        DayOfMonth = Convert.ToInt32(row["DayOfMonth"]),
                        PatternOrdinal = row["PatternOrdinal"].ToString(),
                        PatternDOW = row["PatternDOW"].ToString(),
                        PatternInterval = row["PatternInterval"].ToString()
                    });
vendettamit
  • 14,315
  • 2
  • 32
  • 54