根据需要跳至“特定问题”。一些背景:
方案:我有一组产品,其中包含一个填充了DDL的“向下钻取”过滤器(查询对象)。每个渐进式DDL选择将进一步限制产品列表以及DDL的剩余选项。例如,从工具中选择锤子会限制产品尺寸仅显示锤子尺寸。
当前设置:我创建了一个查询对象,将其发送到存储库,并将每个选项提供给SQL“表值函数”,其中空值表示“获取所有产品”。
我认为这是一项很好的努力,但远不是DDD可以接受的。我想避免SQL中的任何“编程”,希望用存储库做所有事情。对此主题的评论将不胜感激。
具体问题:
如何将此查询重写为Dynamic Query?类似101 Linq Examples之类的链接会非常棒,但具有动态查询范围。我真的想将这个方法传递给引号“”中的字段,我想要一个选项列表以及有多少产品具有该选项。
from p in db.Products
group p by p.ProductSize into g
select new Category {
PropertyType = g.Key,
Count = g.Count() }
每个DDL选项都有“选择(21)”,其中(21)是具有该属性的产品数量。选择一个选项后,所有其他剩余的DDL将使用剩余的选项和计数进行更新。
编辑:附加说明:
.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很棒,但仍在寻找答案。最终,像我这样的完全随机的研究将占上风。 LOL。
修改
IGrouping<string, Product>
。感谢Jon Skeet!投射对象后,您可以枚举集合并将结果提供给单独的列表。
答案 0 :(得分:4)
我不确定如何使用Query语法(如上所述),但使用Method语法,我们可以使用Expression&lt; Func&lt;如下所示。此示例适用于AdventureWorks SQL Server数据库(Products表),并允许您使用字符串指定要分组的列(在此示例中,我选择了大小)
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();
}
}
}
答案 1 :(得分:1)
如果您查看C# Bits,作者将讨论如何使用动态数据创建级联过滤器。这听起来并不像您使用的是动态数据,但他确实有一个很好的表达式构建器,可能对您有所帮助。请参阅BuildQueryBody,然后是Iqueryable上的以下扩展方法部分。
由于您没有使用动态数据,因此您需要处理无法访问“MetaForeignKeyColumn”对象的问题,但我怀疑他的方法可能会帮助您解决问题。
我希望这会有所帮助。