Console.Read()
читает символ из консоли и возвращает его код ASCII. Вы можете прочитать об этом здесь .
Поэтому, если вы введете 50, он будет читать первый символ: «5», а его значение ASCII равно 53.
То есть 100 - 53 = 47.
Вы ищете что-то вроде этого, где Вы определяете "основной" запрос и затем оцениваете параметры, чтобы определить, если, где пункт является соответствующим?
var result = (from x in context.X
select x);
if(some condition)
{
result = result.AsQueryable().Where(x => x.companyName == name);
}
if(some other condition)
{
result = result.AsQueryable().Where(x => x.companyTitle == title);
}
//return result.ToList();
//return result.FirstOrDefault();
//return result.Count(); //etc
Я заметил в одном из Ваших комментариев, Вы упомянули, что к Вашим таблицам не присоединяется внешний ключ? Я не уверен, как Вы получаете связь "один ко многим" без некоторой ссылочной целостности или отношений?
Проверьте блог ScottGu на динамическую linq библиотеку. Я думаю, что это поможет.
Вот пример запроса, который поражает и клиентов и заказывает таблицу:
var query = db.Customers. Where("City = @0 and Orders.Count >= @1", "London", 10). OrderBy("CompanyName"). Select("new(CompanyName as Name, Phone)");
Запрос выше прибыл из образцов C# для Visual Studio. Загрузите и посмотрите в \LinqSamples\DynamicQuery папке, и Вы найдете больше примеров.
Зависит от того, как динамичный Вы хотите, чтобы это было - поскольку другие уже предложили Систему. Linq. Динамическое пространство имен добавляет некоторую аккуратную функциональность для создания запросов, где объекты/участники включенные (таблицы/столбцы) не известны во время проектирования. В этом случае это походит на объекты, и вовлеченные участники уже известны, и просто необходимо чередоваться между различными полями как Вы где критерии пункта. Вот пример этого:
from cust in dc.Customer
join ord in dc.Order on cust.CustomerID equals ord.CustomerID
where (companyName == null || cust.CompanyName == companyName)
and (companyTitle == null || cust.CompanyTitle == companyTitle)
and (orderDate == null || ord.OrderDate == orderDate)
and (shipCity == null || ord.ShipCity == shipCity)
select new {cust, ord}
RobS предоставил то, что я считаю наиболее привлекательным решением. Однако это метод, который я использовал, но потом понял, что он фактически выполняет первый запрос полностью (Linq-To-SQL), а затем последующие предложения .Where () выполняются только с LINQ. Так что это не жизнеспособное решение, поскольку весь набор данных перечисляется, а затем фильтруется в памяти.
Пожалуйста, поправьте меня, если я ошибаюсь - но это то, что я заметил.