Как написать этот Linq SQL как динамический запрос (используя строки)?
-
22-09-2019 - |
Вопрос
Пропустите «конкретный вопрос» по мере необходимости. Некоторый фон:
Сценарий: У меня есть набор продуктов с фильтром «тренировки» (объект запроса), заполненным DDL. Каждый прогрессивный выбор DDL будет дополнительно ограничить список продуктов, а также какие параметры остаются для DDL. Например, выбор молотка из инструментов ограничивает размеры продукта, чтобы показать только размеры молотка.
Текущая настройка: Я создал объект запроса, отправил его в репозиторий и подал каждую опцию в таблицу SQL «Функция оцененной», где нулевые значения представляют «Получить все продукты».
Я считаю это хорошим усилием, но далеко не допустимым DDD. Я хочу избежать каких -либо «программирования» в SQL, надеюсь, делая все с репозиторием. Комментарии по этой теме будут оценены.
Конкретный вопрос:
Как я бы переписал этот запрос как Динамический запрос? Ссылка на что -то вроде 101 примеры LINQ было бы фантастически, но с динамичным применением запроса. Я действительно хочу передать этот метод поле в кавычках «», для которого я хочу список вариантов и сколько продуктов имеет такой вариант.
from p in db.Products
group p by p.ProductSize into g
select new Category {
PropertyType = g.Key,
Count = g.Count() }
Каждая опция DDL будет иметь «выбор (21)», где (21) является количество продуктов, которые имеют этот атрибут. При выборе опции все остальные DDLS обновится с оставшимися параметрами и подсчетами.
РЕДАКТИРОВАТЬ: Дополнительные примечания:
.OrderBy("it.City") // "it" refers to the entire record
.GroupBy("City", "new(City)") // This produces a unique list of City
.Select("it.Count()") //This gives a list of counts... getting closer
.Select("key") // Selects a list of unique City
.Select("new (key, count() as string)") // +1 to me LOL. key is a row of group
.GroupBy("new (City, Manufacturer)", "City") // New = list of fields to group by
.GroupBy("City", "new (Manufacturer, Size)") // Second parameter is a projection
Product
.Where("ProductType == @0", "Maps")
.GroupBy("new(City)", "new ( null as string)")// Projection not available later?
.Select("new (key.City, it.count() as string)")// GroupBy new makes key an object
Product
.Where("ProductType == @0", "Maps")
.GroupBy("new(City)", "new ( null as string)")// Projection not available later?
.Select("new (key.City, it as object)")// the it object is the result of GroupBy
var a = Product
.Where("ProductType == @0", "Maps")
.GroupBy("@0", "it", "City") // This fails to group Product at all
.Select("new ( Key, it as Product )"); // "it" is property cast though
Что я узнал до сих пор, так это Linqpad это фантастика, но все еще ищет ответ. В конце концов, я думаю, что совершенно случайные исследования будут преобладать. РЖУ НЕ МОГУ.
Редактировать:
У Джона Скита была фантастическая идея: бросить то, что мне нужно, как IGrouping<string, Product>
. Анкет Спасибо Джону Скиту! После того, как вы разыгрываете объект, вы можете перечислить по наборам и вписать результаты в отдельный список.
Решение
Я не уверен, как это сделать, используя синтаксис запросов (как указано выше), но используя синтаксис метода, мы можем использовать выражение
using System;
using System.Linq;
using System.Linq.Expressions;
namespace LinqResearch
{
public class Program
{
[STAThread]
static void Main()
{
string columnToGroupBy = "Size";
// generate the dynamic Expression<Func<Product, string>>
ParameterExpression p = Expression.Parameter(typeof(Product), "p");
var selector = Expression.Lambda<Func<Product, string>>(
Expression.Property(p, columnToGroupBy),
p
);
using (LinqDataContext dataContext = new LinqDataContext())
{
/* using "selector" caluclated above which is automatically
compiled when the query runs */
var results = dataContext
.Products
.GroupBy(selector)
.Select((group) => new {
Key = group.Key,
Count = group.Count()
});
foreach(var result in results)
Console.WriteLine("{0}: {1}", result.Key, result.Count);
}
Console.ReadKey();
}
}
}
Другие советы
Если вы посмотрите на C# биты, Автор обсуждает, как создавать каскадные фильтры, используя динамические данные. Это не звучит так, как будто вы используете динамические данные, но у него есть хороший строитель выражения, который может быть полезен для вас. См. BuildQuerybody, а затем следующий раздел методов расширения на iQueryable.
Поскольку вы не используете динамические данные, вам нужно будет иметь дело с отсутствием доступа к объекту «metaforeignkeycolumn», но я подозреваю, что его подход может помочь вам с вашим вопросом.
Надеюсь, это поможет.