передавать различные условия в linq, где [дубликат]

Я понял это. У эмулятора была неправильная версия Служб Play. В первом ответе я задал следующие вопросы: службы Google Play устарели. Требуется 11011000, но найдено 10289574 , и это сработало.

74
задан user20358 4 June 2012 в 17:24
поделиться

6 ответов

Если вы не вызываете ToList() и ваше окончательное сопоставление с типом DTO, вы можете добавить предложения Where по мере продвижения и построить результаты в конце:

var query = from u in DataContext.Users
   where u.Division == strUserDiv 
   && u.Age > 18
   && u.Height > strHeightinFeet
   select u;

if (useAge)
   query = query.Where(u => u.Age > age);

if (useHeight)
   query = query.Where(u => u.Height > strHeightinFeet);

// Build the results at the end
var results = query.Select(u => new DTO_UserMaster
   {
     Prop1 = u.Name,
   }).ToList();

будет по-прежнему приводить к одному вызову в базу данных, что будет эффективно так же эффективно, как и запись запроса за один проход.

125
ответ дан Reed Copsey 4 September 2018 в 10:22
поделиться

Вот мой код, чтобы сделать аналогичную вещь. Это метод для моего WCF SOAP Web Service api.

    public FruitListResponse GetFruits(string color, bool? ripe)
    {
        try
        {
            FruitContext db = new FruitContext();
            var query = db.Fruits.Select(f => f);
            if (color != null)
            {
                query = query.Where(f => f.Color == color);
            }
            if (ripe != null)
            {
                query = query.Where(f => f.Ripe == ripe);
            }
            return new FruitListResponse
            {
                Result = query.Select(f => new Fruit { Id = f.FruitId, Name = f.Name }).ToList()
            };
        }
        catch (Exception e)
        {
            return new FruitListResponse { ErrorMessage = e.Message };
        }
    }

Основной запрос - Select(f => f), что означает, в основном, ВСЕ, а к нему необязательно добавляются предложения Where. Конечный Select является необязательным. Я использую для преобразования объектов строк базы данных в объекты «Плоды».

2
ответ дан John Henckel 4 September 2018 в 10:22
поделиться

один параметр.

bool? age = null

(from u in DataContext.Users
           where u.Division == strUserDiv 
           && (age == null || (age != null && u.Age > age.Value))
           && u.Height > strHeightinFeet  
           select new DTO_UserMaster
           {
             Prop1 = u.Name,
           }).ToList();

, или вы можете переключиться на синтаксис метода для linq и использовать, если условия для присоединения выражений к предложению where.

14
ответ дан Matthew Vines 4 September 2018 в 10:22
поделиться

Исходя из определенного условия, добавьте условие where ...

from u in DataContext.Users
where u.Division == strUserDiv 
&& u.Age != null ? u.Age > 18 : 1== 1
&& u.Height != null ? u.Height > 18 : 1== 1
&& u.Height != null ? u.Height > 18 : 1== 1
 select new DTO_UserMaster
       {
         Prop1 = u.Name,
       }).ToList();
2
ответ дан Melu 4 September 2018 в 10:22
поделиться

Просто я использую его в разделе where where как

    public IList<ent_para> getList(ent_para para){
     db.table1.Where(w=>(para.abc!=""?w.para==para.abc:true==true) && (para.xyz!=""?w.xyz==para.xyz:true==true)).ToList();
}
2
ответ дан Own 4 September 2018 в 10:22
поделиться

Я обычно использую цепочку методов, но имею ту же проблему. И вот расширение, которое я использую

public static IQueryable<T> ConditionalWhere<T>(
        this IQueryable<T> source, 
        Func<bool> condition,
        Expression<Func<T, bool>> predicate)
    {
        if (condition())
        {
            return source.Where(predicate);
        }

        return source;
    }

Это помогает избежать разрывов цепи. Также полезны те же ConditionalOrderBy и ConditionalOrderByDescending.

8
ответ дан Yuriy Granovskiy 4 September 2018 в 10:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: