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;
}
}
(1) в первом блоке кода источника данных является 'ProjectParts.GetQuery() Execute()' и другие два вы получаете данные из исх переменных ' query' - какой из них является правильным источником данных? (2) Также вы хотите использовать 'int? projectId' вход? потому что кажется, что вы хотите также использовать «Содержит» из списка идентификаторов проектов. – Mobigital
Извините за путаницу, мне очень нужен список деталей из ProjectParts.GetQuery(). Execute(). Если бы мне пришлось это сделать как список идентификаторов, и я мог бы использовать его для фильтрации запроса, но, видимо, я не могу использовать его, чтобы он не работал. – LorneCash
Можете ли вы опубликовать свое определение класса 'Part' – Mobigital