Динамическое предложение Where для реляционных таблиц с LINQ to SQL - PullRequest
6 голосов
/ 30 марта 2009

Мне нужна помощь для динамического предложения where для реляционных таблиц (от одного до многих) в LinqToSql.

Пользователь выбирает условия со страницы. (есть 4 ввода, которые пользователь выбирает пункты)

Например, CompanyName и CompanyTitle из таблицы Customer и OrderDate и ShipCity From Order.

Но пользователь может выбрать один или несколько из них на интерфейсе страницы , и динамический запрос будет сгенерирован в codebehind и выбрать From LinqToSql.

Вы можете привести пример аналогичного типа с других веб-страниц.

alt text

Ответы [ 4 ]

12 голосов
/ 31 марта 2009

Вы ищете что-то вроде этого, где вы определяете «базовый» запрос, а затем оцениваете параметры, чтобы определить, подходит ли предложение where?

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

Я заметил, что в одном из ваших комментариев вы упомянули, что ваши таблицы не соединены внешним ключом? Я не уверен, как вы получаете отношения один-ко-многим без какой-либо ссылочной целостности или отношений?

5 голосов
/ 30 марта 2009

Посетите блог 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, и вы найдете больше примеров.

2 голосов
/ 31 марта 2009

Зависит от того, насколько динамичной вы хотите, чтобы она была - как уже предлагали другие, пространство имен System.Linq.Dynamic добавляет некоторую полезную функциональность для составления запросов, когда задействованные сущности / члены (таблицы / столбцы) не известны во время разработки. В этом случае кажется, что сущности и участвующие участники уже известны, и вам просто нужно переключаться между различными полями в соответствии с критериями предложения. Вот пример этого:

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}
0 голосов
/ 23 июня 2010

RobS предоставил, как мне кажется, самое привлекательное решение. Тем не менее, это метод, который я использовал, но потом я понял, что он фактически выполняет первый запрос полностью (Linq-To-SQL), а затем последующие предложения .Where () выполняются только с помощью LINQ. Так что это нереалистичное решение, поскольку весь набор данных перечисляется, а затем отфильтровывается в памяти.

Пожалуйста, поправьте меня, если я ошибаюсь - но это то, что я заметил.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...