DGKumar Ответов: 2

Условный оператор для проверки более чем 1 значения в C#


Не могли бы вы мне помочь, как проверить более 1 значения для проверки в выражении c# lamda

DocumentationLink = context.APIDocumentationTypes.Where(x => x.DocumentationTypeId == a.DocumentationTypeId).Select(x => x.DocumentationDescription).FirstOrDefault().ToLower() != "value1" ? a.DocumentationLink : "",


мне нужно проверить с
value1
и
value2
в той же линии.

Что я уже пробовал:

<pre>DocumentationLink = context.APIDocumentationTypes.Where(x => x.DocumentationTypeId == a.DocumentationTypeId).Select(x => x.DocumentationDescription).FirstOrDefault().ToLower() != "value1" && "value2"? a.DocumentationLink : "",

2 Ответов

Рейтинг:
2

BillWoodruff

Вот вам догадываться на то, что вам может понадобиться сделать:

private DocumentationLink getadl(AContext ctx, APIDocumentationTypes a)
{
    var adl = ctx.APIDocumentationTypes.Where(x => x.DocumentationTypeId == a.DocumentationTypeId)

        .Select(x => x.DocumentationDescription.ToLower())

        .FirstOrDefault(
            descr => !(descr == "value1" || descr == "value2")
    );

    // what is the default Type here if no match is found ?
    return (adl == "") ? null : a.DocumentationLink;
}
Конечно, вы можете создать "промежуточные" переменные в запросе Select, если это необходимо/


DGKumar

Спасибо за ваше ценное предложение.

Мне нужно включить значение результата в свойство, как показано ниже.
результат = из tbl в Data1
выберите (новый APIProp {
DocumID=tbl.ID,
DocumentationLink = контекст.APIDocs.Где (x => x.DocuId == tbl.DocuId).Выберите (x => x. описание).Метода firstordefault().ToLower () ! = "Value1"? tbl.DocumentationLink : ""
}).Где(Х => У Х.DocumentationId == идентификатора docid).Список();

при проверке одного и того же свойства более чем на 1 значение

Рейтинг:
1

OriginalGriff

Попробуй:

string result = context.APIDocumentationTypes.Where(x => x.DocumentationTypeId == a.DocumentationTypeId)
                                             .Select(x => x.DocumentationDescription)
                                             .FirstOrDefault().ToLower();
DocumentAtionLink = ( result != "value1" && result != "value2") ? a.DocumentationLink : "";
Но обратите внимание, что FirstOrDefault будет возвращать null если нет элементов, которые соответствовали бы вашему Select - в какой момент ваш ToLower вызов вызовет NullReferenceException.


BillWoodruff

Привет, я продолжаю видеть этот вызов 'Firstordefault без предиката, за которым следует' ToLower, как гарантированную ошибку. Я что-то пропустил ?

OriginalGriff

FirstOrDefualt не нуждается в предикате / лямбда-выражении - он просто возвращает первое из перечисляемой последовательности или null, если коллекция пуста.
Поскольку Select, который предшествует ему, возвращает коллекцию строк IEnumerable (или она не может быть сравнена в его исходном коде со строкой), вы можете вызвать ToLower для нее.
Что касается меня, то я бы опустил ToLower до тех пор, пока не проверил нулевое возвращение, но ваше решение использовать его внутри Select lambda столь же эффективно (поскольку вся последовательность не вычисляется с помощью FirstOrDefault, поэтому она не генерирует нежелательные строки для каждого элемента).

[edit]FirstOrDefualt может взять лямбду. конечно.[/редактировать]

OriginalGriff

:dох: смерть мозга является параметром метода firstordefault *может* принять предикат, конечно, может. :вздох:

BillWoodruff

Мой мозг поврежден сильнее, чем ваш, и у меня есть годы пробега по моим нейронам, чтобы доказать это :)

У меня сложилось впечатление, что ОП хочет повторить совпадения для x.DocumentationTypeId == a.DocumentationTypeId).Выберите (x =>x. DocumentationDescription, а затем найдите первый в этом IEnumerable & lt;ocumentationdescription>, который не совпадает с "value1" и " value2"