При работе с выбираемыми пользователем критериями поиска вам нужно будет указать возможные варианты выбора.При работе со строками поиска я рекомендую использовать синтаксис Fluent вместо синтаксиса Linq QL, поскольку он создает выражение, которое можно условно изменить по ходу работы.Оттуда вы можете использовать Predicate & PredicateBuilder для динамического составления условия WHERE.
Решение Жака будет работать, но недостатком этого подхода является то, что вы создаете довольно большой и сложный оператор SQL, который условно применяет критерии.Я предпочитаю условно добавлять в код предложения WHERE, чтобы SQL был настолько сложным, насколько это необходимо.
Если вы хотите сделать что-то вроде интеллектуального поиска (представьте, что Google с одной текстовой записьюпоиск по нескольким возможным полям)
var whereClause = PredicateBuilder.False<StudentData>();
int id;
DateTime date;
if(int.TryParse(searchTxt, out id))
whereClause = whereClause.Or(x => x.SID == id);
else if(DateTime.TryParse(searchTxt, out date))
whereClause = whereClause.Or(x => x.BirthDate == date);
else
whereClause = whereClause.Or(x => x.FirstName.Contains(searchTxt));
var data = db.StudentData
.Where(whereClause)
.Select(a => new
{
ID = a.SID,
Birthdate = a.BIRTHDTE,
FirstName = a.FNAMES,
PreviousName = a.PREVSURNAME,
EntryQualAwardID = a.EntryQuals.ENTRYQUALAWARDID,
AwardDate = a.EntryQuals.AWARDDATE
}).ToList();
Это выполняет некоторые базовые оценки критериев поиска, чтобы определить, соответствует ли он цели поиска.Т.е. если они могут выполнять поиск по имени, дате или идентификатору, а идентификаторы являются числовыми, мы будем искать только по идентификатору, если критерии были числовыми.Если это выглядит как дата, мы ищем по дате, в противном случае мы ищем по имени.(и, возможно, другие доступные для поиска строки)
Если они могут искать ID, FirstName и BirthDate и ввести одно или несколько из них в качестве отдельных полей ввода (страница критериев поиска), то в зависимости от того, какие записи они заполняют, вы можетелибо передайте отдельные обнуляемые параметры и выполните вышеизложенное в зависимости от того, какие параметры передаются, или передайте список значений поиска с чем-то вроде Enum, для которого искали значение:
Т.е. по параметрам:
private void ByParameters(int? id = null, DateTime? birthDate = null, string name = null)
{
var whereClause = PredicateBuilder.False<StudentData>();
if(id.HasValue)
whereClause = whereClause.Or(x => x.SID == id.Value);
if(date.HasValue)
{
DateTime dateValue = date.Value.Date;
whereClause = whereClause.Or(x => x.BirthDate == dateValue);
}
if (!string.IsNullOrEmpty(name))
whereClause = whereClause.Or(x => x.FirstName.Contains(name));
// ....
}
Если число параметров начинает становиться большим, то может быть создан пользовательский тип для инкапсуляции отдельных значений NULL.Т.е.:
[Serializable]
public class SearchCriteria
{
public int? Id { get; set; }
public DateTime? BirthDate { get; set; }
public string Name { get; set; }
}
private void ByParameters(SearchCriteria criteria)
{
// ....
}
Или вы можете составить более динамический объект списка параметров с типом и значением критерия, но он начинает становиться более сложным, чем это, вероятно, стоит.