我们如何在ideablade的谓词描述中的where子句中添加多个Or和And Operations。 离。
List < PredicateDescription > pdList = new List< PredicateDescription >();
Dictionary< int, List< PredicateDescription>> pdDateList = new Dictionary< int, List< PredicateDescription>>();
var pds = pdList.ToArray();
if (((pds.Length > 0) || (pdDateList.Count > 0)))
{
CompositePredicateDescription predicate = null;
if (pds.Length > 0)
{
predicate = PredicateBuilder.And(pds);
}
List<PredicateDescription> AndList = null;
CompositePredicateDescription compositePredicateDescription = null;
for (int i = 0; i < pdDateList.Count; i++)
{
List<PredicateDescription> pdlist1 = pdDateList[i];
AndList = new List<PredicateDescription>();
foreach (PredicateDescription pdesc in pdlist1)
{
AndList.Add(pdesc);
}
if (AndList.Count > 0)
{
if (predicate != null)
{
if (AndList.Count == 2)
{
predicate.Or(AndList[0].And(AndList[1]));
}
else if (AndList.Count == 1)
{
predicate.Or(AndList[0]);
}
}
}
}
}
if (predicate == null)
{
predicate = compositePredicateDescription;
}
var filterQuery = query.Where(predicate);
data = Globals.sLDManager.ExecuteQuery(filterQuery);
如上所述我尝试在CompositePredicateDescription
中添加Or运算符,但它无效
我想运行以下查询 -
Select * from Tabel1 where t.field1=1 and t.field2=1 and t.field3=1 Or ( t.field4=1 and t.field5=1) Or (t.field6=1 and t.field7=1)
如何使用ideablade运行上述查询。
答案 0 :(得分:2)
在这种情况下你应该可以毫无问题地使用CompositePredicateDescription
。它怎么不起作用?
以下是一个例子:
PredicateDescription p1 = PredicateBuilder.Make(typeof(Product), "UnitPrice", FilterOperator.IsGreaterThanOrEqualTo, 24);
PredicateDescription p2 = PredicateBuilder.Make(typeof(Product), "Discontinued", FilterOperator.IsEqualTo, true);
CompositePredicateDescription p3 = p1.And(p2);
PredicateDescription p4 = PredicateBuilder.Make(typeof(Product), "UnitsInStock", FilterOperator.IsGreaterThanOrEqualTo, 1);
PredicateDescription p5 = PredicateBuilder.Make(typeof(Product), "UnitsOnOrder", FilterOperator.IsGreaterThanOrEqualTo, 1);
CompositePredicateDescription p6 = p1.And(p2);
CompositePredicateDescription p7 = p3.Or(p6);
var query = mgr.Products.Where(p7);
上面的代码将生成下面的WHERE语句(来自SQL Profiler),该语句与查询中的WHERE语句具有相同的模式:
WHERE (([Extent1].[UnitPrice] >= cast(24 as decimal(18))) AND (1 = [Extent1].[Discontinued])) OR (([Extent1].[UnitPrice] >= cast(24 as decimal(18))) AND (1 = [Extent1].[Discontinued]))
如果您还没有这样做,可能需要查看关于动态WHERE子句的DevForce Resource Center文章。