2015-08-05 2 views
0

У меня есть запрос на выборку с Linq вроде этого:Выбрать столбцы с конкретным состоянием с помощью Linq к SQL

 string _mycondition = "0"; 

      DataClasses1DataContext m = new DataClasses1DataContext(); 
      var q = from p in m.ViewPersonCarRelations.AsEnumerable()      
       select new 
       { 
        FirstName = p.name, 
        LastName = p.Lname 
       }; 

Я хочу, чтобы выбрать мои столбцы с условием, например: только если _mycondition == «0 "true, выберите p.name и назовите его FirstName, иначе моя переменная не должна иметь FirstName. Мне было интересно, возможно ли это сделать с Linq?

+0

Вы хотите выбрать все, где имя не пустое? – oqx

+0

@OmarQaddoumi no! Я хочу решить во время выполнения, которые выбирают FirstName или нет! – mosyflasher

ответ

2

Нет, это невозможно. Самый простой способ достижения этой цели будет использовать тройной оператор вроде этого:

var q = from p in m.ViewPersonCarRelations.AsEnumerable()      
       select (_mycondition == "0") ? 
        new 
        { 
         FirstName = p.name, 
         LastName = p.Lname 
        } 
        : 
        new 
        { 
         LastName = p.Lname 
        }; 

Этот код будет, вероятно, приведет к следующей ошибке компилятора:

Type of conditional expression cannot be determined because there is no implicit conversion between 'AnonymousType#1' and 'AnonymousType#2'

Поскольку не существует никакого способа перегрузки операторов для анонимных типов, вам нужно будет найти другой способ достижения своей цели. Вы можете создать два класса, перегрузить неявный оператор и вообще не использовать анонимные типы.

EDIT

Там на самом деле это способ сделать это, но я бы настоятельно совет против него - вы получите Enumerable<object> как результат. Поскольку object является базовым типом всех типов в платформе .NET, вы можете сделать второй анонимный класс object (вы также можете перенести первый, но это будет избыточным).

select (_mycondition == "0") ? 
    new 
    { 
     FirstName = p.name, 
     LastName = p.Lname 
    } 
    : 
    (object)new 
    { 
     LastName = p.Lname 
    }; 
1

Если я понимаю, что вы говорите, вы хотите решить во время выполнения, будет ли анонимный тип q, который вы создаете, иметь свойство FirstName или нет.

Это невозможно в системе статического типа. Причина в том, что, хотя вы не указали тип q, он имеет тип: это только «анонимно» для нас, кодеров. Компилятор должен знать, что это такое. Он не может оставаться неопределенным до времени выполнения.

Есть одно исключение из этого. Я считаю, что вы могли бы сделать что-то вроде того, что хотите, используя ExpandoObject, часть пространства имен System.Dynamic. Это позволит вам создавать новые свойства во время выполнения.

Но было бы проще просто указать FirstName на ваш тип и иногда иметь нулевое значение.

string _mycondition = "0"; 

DataClasses1DataContext m = new DataClasses1DataContext(); 
var q = from p in m.ViewPersonCarRelations.AsEnumerable()      
    select new 
    { 
      FirstName = (_mycondition=="0") ? p.name : null, 
      LastName = p.Lname 
    }; 
+0

Как вы сказали, я хочу решить во время выполнения, что моя переменная содержит FirstName или нет – mosyflasher

+0

Потому что я хочу экспортировать мой запрос в excel, а моя колонка не должна существовать! – mosyflasher

+0

@mosyflasher: Может быть, вам нужна другая структура данных, чем класс с одним свойством = один столбец. Подумайте об использовании старомодного 'DataTable'. Вы можете определить новые столбцы во время выполнения, используя любые критерии, которые вы хотите. –