Как получить одно значение запроса Linq внутри, используя оператор? - PullRequest
0 голосов
/ 01 октября 2019

У меня есть контроллер ASP.NET MVC, который перебирает массив, отправленный через ajax. Мне нужно получить одно значение Guid из другой модели представления, которую я создал. Эти значения являются статическими и основаны на внутренней таблице.

Я добавлю это значение вместе с другими в базу данных, которую я настроил для него. Foreach проходит по циклу и вставляет несколько строк в зависимости от размера массива. Проблема в том, что когда я запускаю запрос LINQ внутри оператора using и foreach, я получаю ошибку «Последовательность не содержит элементов». Как только я беру запрос LINQ за его пределы (см. Второй пример), он возвращает индивидуальное значение.

Я не могу этого сделать, потому что мне нужно вставить определенное значение, поскольку оно циклически повторяется на основе значений индекса массива.

Я пробовал несколько решений на этом, и ни одно из них не достигает этого. Когда я использую просто .Single (), он говорит мне, что в моей последовательности нет элементов. Когда я использую single или default, он вставляет значение Guid только с нулями. Я пробовал SingleOrDefault () .., который вставляет Guid только с нулями. Я прочитал и посмотрел на другие вопросы и ссылки .. Начал с этого, но без ответа .. c # LINQ: как получить единственный результат

Вот пример одного изконтроллер.

// Action Method
[HttpPost]
public ActionResult MyAction(string[] values, string uniqline, string uniqpolicy, string uniqlinetype)
{
    Guid UniqLineType = Guid.Parse(uniqlinetype);   // This is the Line guid

    int ul = Convert.ToInt32(uniqline);     // UniqLine 
    int up = Convert.ToInt32(uniqpolicy);   // UniqPolicy

    // Make a list of sublines
    List<getSublineTypeVM> subLine;

    using (TruckingDb db = new TruckingDb())
    {
         subLine = db.getSublines.ToArray().OrderBy(x => x.RID)
                     .Select(x => new getSublineTypeVM(x)).ToList();

         Guid newGuid;

         foreach (var item in values)
         {
             TestTableCIF dto = new TestTableCIF();

             var ust = (from u in subLine
                        where (u.UniqLineType == UniqLineType && u.SubLine_Name == item)
                        select new { u.UniqSublineType }).Single();

             newGuid = Guid.Parse(ust.ToString());

             // here's where we will DTO 
             // might look like
             dto.UniqSublineID = Guid.NewGuid();   // Table primary key
             dto.UniqSublineType = ust.UniqSublineType; ; // this will have to be the LineName instead. for now use the line type GUid
             dto.UniqLineType = UniqLineType;
             dto.UniqLine = ul;
             dto.UniqPolicy = up;
             dto.Selected = true;
             dto.LineName = item;

             db.TestTableCIFs.Add(dto);
         }

         db.SaveChanges();
    }

    return Content ("Works McGoogle");
}

Во втором примере я перемещаю запрос LINQ за пределы оператора using. Я могу получить правильное значение, но только одно, потому что мне нужно использовать статическое сравнение в запросе.

// Action Method
[HttpPost]
public ActionResult MyAction(string[] values, string uniqline, string uniqpolicy, string uniqlinetype)
{
    Guid UniqLineType = Guid.Parse(uniqlinetype);    // This is the Line guid

    int ul = Convert.ToInt32(uniqline);     // UniqLine 
    int up = Convert.ToInt32(uniqpolicy);   // UniqPolicy

    // Make a list of sublines
    List<getSublineTypeVM> subLine;

    using (TruckingDb db = new TruckingDb())
    {
        subLine = db.getSublines.ToArray().OrderBy(x => x.RID)
                    .Select(x => new getSublineTypeVM(x)).ToList();

        Guid newGuid;

        foreach (var item in values)
        {
            TestTableCIF dto = new TestTableCIF();

            newGuid = Guid.Parse(ust.ToString());

            // here's where we will DTO 
            // might look like
            dto.UniqSublineID = Guid.NewGuid();     // Table primary key
            dto.UniqSublineType = Random and left out for brevity ; //this will have to be the LineName instead. for now use the line type GUid
            dto.UniqLineType = UniqLineType;
            dto.UniqLine = ul;
            dto.UniqPolicy = up;
            dto.Selected = true;
            dto.LineName = item;

            db.TestTableCIFs.Add(dto);
        }

        db.SaveChanges();
    }

    var ust = (from u in subLine
               where (u.UniqLineType == UniqLineType && u.SubLine_Name == "BI/PD")
               select new { u.UniqSublineType }).Single();

    // This works, but only returns one value based on the static search
    return Content ("It worked");
}

Я ожидаю, что запрос вернет правильное значение и передаст вместе с другими значениями. Тем не менее, последовательность либо пуста, либо просто вставляет Guid, который имеет только нули. Не фактическое значение guid, извлеченное из запроса. Любая помощь будет принята с благодарностью.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...