LINQ-动态查询中的连接

LINQ-动态查询中的连接,linq,dynamic,join,Linq,Dynamic,Join,由于一些商业决定,我需要改变一下我正在做的事情。耶我。:) 目前,我有: public IOrderedQueryable<ProductDetail> GetProductList(string productGroupName, string productTypeName, Dictionary<string,List<string>> filterDictionary) { string whereClause = "ProductGroupN

由于一些商业决定,我需要改变一下我正在做的事情。耶我。:)

目前,我有:

public IOrderedQueryable<ProductDetail> GetProductList(string productGroupName, string productTypeName, Dictionary<string,List<string>> filterDictionary)
{
    string whereClause = "ProductGroupName='" + productGroupName + "' AND ProductTypeName='" + productTypeName + "'";
    string comma = "";
    foreach (KeyValuePair<string, List<string>> myKVP in filterDictionary)
    {
        comma = "";
        if (myKVP.Value.Count > 0)
        {
            whereClause = String.Format("{0} AND FieldName = {1} AND FieldValue IN (", whereClause, myKVP.Key);
            foreach (string value in myKVP.Value)
            {
                whereClause = String.Format("{0}{1}'{2}'", whereClause, comma, value);
                comma = ",";
            }
            whereClause = String.Format("{0})", whereClause);
        }
    }

    var q = db.ProductDetail
              .Where (whereClause)
              .OrderBy ("ProductTypeName");
    return q;
}

我没有一个好的“答案”给你,但更多的是旁白。退房你甚至可以在这页的右边看到一则广告。编写LINQ查询非常流畅。它可能有助于编写和验证此查询以及您将来编写的任何其他LINQ查询。

哎哟。是的,这是一个复杂的要求。你知道,lambda是累积的,所以如果你使用连续的linq表达式,你可以做得更简单。请注意,后续linq表达式使用的是先前的表达式结果,整个表达式直到迭代后才实际执行

public IOrderedQueryable<ProductDetail> GetProductList(string productGroupName, string productTypeName, Dictionary<string,List<string>> filterDictionary)
{
    // Initial select on productGroupName and productTypeName
    var products = from product in db.ProductDetail
                   where product.ProductGroupName == productGroupName && product.ProductTypeName == productTypeName
                   select product;

    // Now add each filter item present.
    foreach (KeyValuePair<string, List<string>> myKVP in filterDictionary)
    {
        products = from product in products
                   join pfa in db.ProductFilterAssignment on product.ProductID equals pfa.ProductID
                   join pf in db.Product on pfa.FilterID equals pf.FilterId
                   where pf.FieldName == myKVP.Key && myKVP.Value.Contains(pf.FieldValue)
                   select product;
    }

    return products.OrderBy ("ProductTypeName");
}
public IOrderedQueryable GetProductList(string productGroupName、string productTypeName、Dictionary filterDictionary)
{
//对productGroupName和productTypeName进行初始选择
var products=来自db.ProductDetail中的产品
其中product.ProductGroupName==ProductGroupName&&product.ProductTypeName==ProductTypeName
选择产品;
//现在添加每个过滤器项。
foreach(筛选器字典中的KeyValuePair myKVP)
{
产品=来自产品中的产品
将pfa加入db.ProductFilterSignation on product.ProductID等于pfa.ProductID
在pfa.FilterID上的db.乘积等于pf.FilterID中加入pf
其中pf.FieldName==myKVP.Key&&myKVP.Value.Contains(pf.FieldValue)
选择产品;
}
return products.OrderBy(“ProductTypeName”);
}
尝试使用。它有助于对LINQtoSQL和实体框架进行动态查询。您可以动态创建左/内联接、添加条件、订单和其他内容。如果您使用Spolty Framework,那么您的代码如下所示:

public IQueryable<ProductDetail> GetProductList(string productGroupName, string productTypeName, Dictionary<string, List<string>> filterDictionary)
{
    // create root node 
    JoinNode productDetailNode = new JoinNode(typeof(ProductDetail));
    productDetailNode.AddConditions(new Condition("ProductGroupName", productGroupName),
                    new Condition("ProductTypeName", productTypeName));

    // if there are conditions than we create joins
    if (filterDictionary.Count > 0)
    {
        // create joinNode  
        // INNER JOIN ProductFilterAssignment pfa ON pd.ProductID = pfs.ProductID
        JoinNode productFilterAssignmentNode = new JoinNode(typeof(ProductFilterAssignment));
        productDetailNode.AddChildren(productFilterAssignmentNode);

        // create joinNode  
        // INNER JOIN ProductFilter pf ON pfs.FIlterID = pf.FIlterID
        JoinNode productFilterNode = new JoinNode(typeof(ProductFilter));
        productFilterNode.AddChildren(productFilterNode);

        foreach (KeyValuePair<string, List<string>> myKVP in filterDictionary)
        {
            // create condition pf.FieldName = {1} And AND pf.FieldValue IN ('var1a','var1b','var1c',etc)
            productFilterNode.AddConditions(new Condition("FieldName", myKVP.Key),
                                            OrCondition.Create("FieldValue", myKVP.Value.ToArray()));
        }
    }

    // create result query by JoinNode productDetailNode
    QueryDesigner queryDesigner = new QueryDesigner(db, productDetailNode).
                                        OrderBy(new Ordering("ProductTypeName"));

    return queryDesigner.Cast<ProductDetail>();
}
public IQueryable GetProductList(string productGroupName、string productTypeName、Dictionary filterDictionary)
{
//创建根节点
JoinNode productDetailNode=新的JoinNode(typeof(ProductDetail));
productDetailNode.AddConditions(新条件(“ProductGroupName”,ProductGroupName),
新条件(“ProductTypeName”,ProductTypeName));
//如果有条件,我们将创建联接
如果(filterDictionary.Count>0)
{
//创建joinNode
//pd.ProductID=pfs.ProductID上的内部联接ProductFilterSignement pfa
JoinNode ProductFilterAsignmentNode=新的JoinNode(typeof(ProductFilterAsignment));
AddChildren(ProductFilterAsignmentNode);
//创建joinNode
//pfs.FIlterID=pf.FIlterID上的内部联接ProductFilter pf
JoinNode productFilterNode=新的JoinNode(typeof(ProductFilter));
productFilterNode.AddChildren(productFilterNode);
foreach(筛选器字典中的KeyValuePair myKVP)
{
//在('var1a'、'var1b'、'var1c'等)中创建条件pf.FieldName={1}和pf.FieldValue
productFilterNode.AddConditions(新条件(“字段名”,myKVP.Key),
创建(“FieldValue”,myKVP.Value.ToArray());
}
}
//按JoinNode productDetailNode创建结果查询
QueryDesigner QueryDesigner=新的QueryDesigner(db,productDetailNode)。
订购人(新订购(“ProductTypeName”);
返回queryDesigner.Cast();
}

我还找到了这个关于将SQL转换为LINQ的链接。它可能有用:。它适用于VB.NET,但其中的内容对C#仍然有用。
public IQueryable<ProductDetail> GetProductList(string productGroupName, string productTypeName, Dictionary<string, List<string>> filterDictionary)
{
    // create root node 
    JoinNode productDetailNode = new JoinNode(typeof(ProductDetail));
    productDetailNode.AddConditions(new Condition("ProductGroupName", productGroupName),
                    new Condition("ProductTypeName", productTypeName));

    // if there are conditions than we create joins
    if (filterDictionary.Count > 0)
    {
        // create joinNode  
        // INNER JOIN ProductFilterAssignment pfa ON pd.ProductID = pfs.ProductID
        JoinNode productFilterAssignmentNode = new JoinNode(typeof(ProductFilterAssignment));
        productDetailNode.AddChildren(productFilterAssignmentNode);

        // create joinNode  
        // INNER JOIN ProductFilter pf ON pfs.FIlterID = pf.FIlterID
        JoinNode productFilterNode = new JoinNode(typeof(ProductFilter));
        productFilterNode.AddChildren(productFilterNode);

        foreach (KeyValuePair<string, List<string>> myKVP in filterDictionary)
        {
            // create condition pf.FieldName = {1} And AND pf.FieldValue IN ('var1a','var1b','var1c',etc)
            productFilterNode.AddConditions(new Condition("FieldName", myKVP.Key),
                                            OrCondition.Create("FieldValue", myKVP.Value.ToArray()));
        }
    }

    // create result query by JoinNode productDetailNode
    QueryDesigner queryDesigner = new QueryDesigner(db, productDetailNode).
                                        OrderBy(new Ordering("ProductTypeName"));

    return queryDesigner.Cast<ProductDetail>();
}