2017-02-08 15 views
0
partial void PartsInProject_PreprocessQuery(int? projectId, ref IQueryable<Part> query) 
    { 

     query = (from projectPart in ProjectParts.GetQuery().Execute() 
       where projectPart.Project.Id == projectId 
       select projectPart.Part).AsQueryable(); 

     var test = query.ToList(); 
    } 

Этот код компилируется, кажется, работает ... То, что я имею в виду, когда я поставил точку останова на тест вар и проверить его, он имеет правильные (отфильтрованные) элементы, но при просмотре результатов на экране он отображает весь список без фильтрации.LightSwitch PreprocessQuery не фильтрует

Это должно быть так же просто, как это:

partial void PartsInProject_PreprocessQuery(int? projectId, ref IQueryable<Part> query) 
    { 
     IEnumerable<int> projectPartIds = new[] {1, 2, 3}; 

     query = from part in query 
       where projectPartIds.Contains(part.Id) 
       select part; 
    } 

Но когда я делаю это LightSwitch выдает ошибку, которая гласит:

Не Реализован Inner сообщение об исключении: Метод «содержит» не поддерживается.

Это с другой стороны, работает отлично, но мне не помогает:

partial void PartsInProject_PreprocessQuery(int? projectId, ref IQueryable<Part> query) 
    { 
     query = from part in query 
       where (part.Id == 1 || part.Id == 2 || part.Id == 3) 
       select part; 
    } 

EDIT 1:

За предложение я также попытался это следующим образом:

partial void PartsInProject_PreprocessQuery(int? projectId, ref IQueryable<Part> query) 
    { 
     var projectPartIds = new List<int> {1, 2, 3}; 

     query = from part in query 
       where projectPartIds.Contains(part.Id) 
       select part; 
    } 

Но затем я получаю эту ошибку: Не реализовано Внутреннее сообщение об исключении: Значение выражения (System.Collections.Generic.List`1 [Syst . Em.Int32]) Конт модули ([10007] .id) не поддерживается

EDIT 2:

Вот список вещей, которые я пробовал и их соответствующие ошибки:

partial void PartsInProject_PreprocessQuery(int? projectId, ref IQueryable<Part> query) 
    { 
     var projectPartIds = new List<int> {1, 2, 3}; 

     query = from part in query 
       where projectPartIds.All(x => x != part.Id) 
       select part; 
    } 

ОШИБКА: метод Все не поддерживается, когда MaxProtocolVersion является деваха чем 3,0

partial void PartsInProject_PreprocessQuery(int? projectId, ref IQueryable<Part> query) 
    { 
     var projectPartIds = new[] { 1, 2, 3 }; 
     query = query.Where(x => projectPartIds.Contains(x.Id)); 
    } 

ОШИБКА: метод содержит в не поддерживается

//I forgot to save the code for this example... 

ОШИБКА: Join Не поддерживается

partial void PartsInProject_PreprocessQuery(int? projectId, ref IQueryable<Part> query) 
    { 
     var projectPartIds = new List<int> { 1, 2, 3 }; 
     IQueryable<Part> qTest = null; 
     foreach (var partId in projectPartIds) 
     { 
      if (qTest == null) 
      { 
       qTest = from part in query 
         where part.Id != partId 
         select part; 
      } 
      else 
      { 
       qTest = (from part in query 
         where part.Id != partId 
         select part) 
        .Union(
         from part in qTest 
         select part 
        ); 
      } 
     } 
     query = qTest; 
    } 

ОШИБКА: Союз не поддерживается

partial void PartsInProject_PreprocessQuery(int? projectId, ref IQueryable<Part> query) 
    { 
     var q1 = from part in query 
       where part.Id == 1 
       select part; 

     var q2 = from part in query 
       where part.Id == 2 
       select part; 

     query = q1.Concat(q2); 
    } 

ОШИБКА: Метод Concat не поддерживается

partial void PartsInProject_PreprocessQuery(int? projectId, ref IQueryable<Part> query) 
    { 
     var temp = this.ProjectParts.GetQuery().Execute().AsQueryable(); 
     query = from p in query 
       from pp in temp 
       where pp.Part.Id == p.Id 
       select p; 
    } 

ОШИБКА: Expression типа System.Linq.IQueryable [LightSwitchApplication.Pro jectPart] не может быть использована для возврата типа System.Collections.Generic.IEnumerable [LightSwitchApplication.Implementation.ProjectPart]

partial void PartsInProject_PreprocessQuery(int? projectId, ref IQueryable<Part> query) 
    { 
     var projectPartIds = (from pp in ProjectParts.GetQuery().Execute() 
           where pp.Project.Id == projectId.Value 
           select pp.Part).AsQueryable(); 
     query = query.Intersect(projectPartIds); 
    } 

ERROR: Выражение не поддерживается (Intersect).Типы аргументов не соответствуют

partial void PartsInProject_PreprocessQuery(int? projectId, ref IQueryable<Part> query) 
    { 
     var projectPartIds = (from pp in ProjectParts.GetQuery().Execute() 
           where pp.Project.Id == projectId 
           select pp.Part.Id).ToList(); 

     var tempQuery = query; 
     foreach (var partId in projectPartIds) 
     { 
      tempQuery = from p in tempQuery 
         where p.Id != partId 
         select p; 
     } 

     query = query.Except(tempQuery); 
    } 

ОШИБКА: Метод За исключением не поддерживается

Заключительные заметки (Update 2):

я нашел одну вещь, которая работает, и это достаточно хорошо для demo в пятницу, где у меня будет только 10 частей, но это неприемлемо, потому что я не верю, что он может масштабироваться, когда у меня есть 500K частей. Вот код только в случае, если это дает кому-либо идею, я не пробовал:

partial void PartsInProject_PreprocessQuery(int? projectId, ref IQueryable<Part> query) 
    { 
     var projectPartIds = (from pp in ProjectParts.GetQuery().Execute() 
           where pp.Project.Id == projectId 
           select pp.Part.Id).ToList(); 

     var allPartIds = (from p in Parts.GetQuery().Execute() 
          select p.Id).ToList(); 

     var nonProjectPartIds = allPartIds.Except(projectPartIds).ToList(); 

     foreach (var partId in nonProjectPartIds) 
     { 
      query = from p in query 
        where p.Id != partId 
        select p; 
     } 
    } 
+0

(1) в первом блоке кода источника данных является 'ProjectParts.GetQuery() Execute()' и другие два вы получаете данные из исх переменных ' query' - какой из них является правильным источником данных? (2) Также вы хотите использовать 'int? projectId' вход? потому что кажется, что вы хотите также использовать «Содержит» из списка идентификаторов проектов. – Mobigital

+0

Извините за путаницу, мне очень нужен список деталей из ProjectParts.GetQuery(). Execute(). Если бы мне пришлось это сделать как список идентификаторов, и я мог бы использовать его для фильтрации запроса, но, видимо, я не могу использовать его, чтобы он не работал. – LorneCash

+0

Можете ли вы опубликовать свое определение класса 'Part' – Mobigital

ответ

0

Чтобы использовать Contains определить ваш projectPartIds как List<int>. компилируется и работает нормально:

public static void test4() 
{ 
    List<Part> parts = new List<Part>(); 
    parts.Add(new Part() { Id = 1 }); 
    parts.Add(new Part() { Id = 2 }); 
    parts.Add(new Part() { Id = 10 }); 
    parts.Add(new Part() { Id = 11 }); 
    var query = parts.AsQueryable(); 

    List<int> projectPartIds = new List<int>(new []{ 1, 2, 3 }); 

    var results = from part in query 
      where projectPartIds.Contains(part.Id) 
      select part; 
    foreach (var res in results) 
    { 
     Console.WriteLine("Result="+res.Id); 
    } 
} 
public class Part 
{ 
    public int Id; 
} 

просто проверял, и здесь выход, без исключений:

enter image description here

EDIT2

даже это работает:

static void Main(string[] args) 
{ 
    test5(); 
    Console.ReadLine(); 
} 

public static void test5() 
{ 
    List<Part> parts = new List<Part>(); 
    parts.Add(new Part() { Id = 1 }); 
    parts.Add(new Part() { Id = 2 }); 
    parts.Add(new Part() { Id = 10 }); 
    parts.Add(new Part() { Id = 11 }); 
    var query = parts.AsQueryable(); 

    test4(ref query); 
} 
public static void test4(ref IQueryable<Part> query) 
{ 

    List<int> projectPartIds = new List<int>{ 1, 2, 3 }; 

    query = from part in query 
      where projectPartIds.Contains(part.Id) 
      select part; 

    foreach (var res in query) 
    { 
     Console.WriteLine("Result="+res.Id); 
    } 
} 

делает тот же выход, что и выше.

EDIT 3

Я подозревал, что ваш Query поставщик (реализация в ProjectParts.GetQuery().Execute()) не поддерживает List<>.Contains, в этом случае лучше всего ToList() результатов запроса и затем извлечь приготовленный результат в другой объект запроса и затем используйте это. В противном случае модифицируя исходный запрос связан с проблемами:.

static void Main(string[] args) 
{ 
    test5(); 
    Console.ReadLine(); 
} 

public static void test5() 
{ 
    List<Part> parts = new List<Part>(); 
    parts.Add(new Part() { Id = 1 }); 
    parts.Add(new Part() { Id = 2 }); 
    parts.Add(new Part() { Id = 10 }); 
    parts.Add(new Part() { Id = 11 }); 
    var query = parts.AsQueryable(); 

    IQueryable<Part> preparedQuery; 
    test6(query, out preparedQuery); // results are output into preparedQuery 

    foreach (var res in preparedQuery) 
    { 
     Console.WriteLine("Result=" + res.Id); 
    } 
} 

public static void test6(IQueryable<Part> origQuery, out IQueryable<Part> preparedQuery) 
{ 

    List<int> projectPartIds = new List<int> { 1, 2, 3 }; 
    var queryList = origQuery.ToList(); // convert to list to get a working Contains 

    preparedQuery = (from part in queryList 
      where projectPartIds.Contains(part.Id) 
      select part).AsQueryable(); 

} 
+0

Это тоже не работает ... Не реализовано Сообщение о внешнем исключении: Значение выражения (System.Collections.Generic.List'1 [System.Int32]). Содержит ([10007] .Id) не поддерживается , – LorneCash

+0

См. Изменение выше, чтобы узнать, не сделал ли я что-то неправильно. – LorneCash

+0

см. Мое редактирование выше, это работает нормально, глядя на ваше редактирование ... – Mobigital

 Смежные вопросы

  • Нет связанных вопросов^_^