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>();
}