C# 亚音速3,运行时构建动态或表达式
在这种情况下,我必须根据用户选择动态构建linq查询。 如果我必须动态生成sql,我可以这样做:C# 亚音速3,运行时构建动态或表达式,c#,mysql,linq,subsonic,predicatebuilder,C#,Mysql,Linq,Subsonic,Predicatebuilder,在这种情况下,我必须根据用户选择动态构建linq查询。 如果我必须动态生成sql,我可以这样做: var sb = new StringBuilder(); sb.AppendLine("SELECT * FROM products p"); sb.AppendLine("WHERE p.CategoryId > 5"); // these variables are not static but choosen by th
var sb = new StringBuilder();
sb.AppendLine("SELECT * FROM products p");
sb.AppendLine("WHERE p.CategoryId > 5");
// these variables are not static but choosen by the user
var type1 = true;
var type2 = true;
var type3 = false;
string type1expression = null;
string type2expression = null;
string type3expression = null;
if (type1)
type1expression = "p.productType1 = true";
if (type2)
type2expression = "p.productType2 = true";
if (type3)
type3expression = "p.productType3 = true";
string orexpression = String.Empty;
foreach(var expression in new List<string>
{type1expression, type2expression, type3expression})
{
if (!String.IsNullOrEmpty(orexpression) &&
!String.IsNullOrEmpty(expression))
orexpression += " OR ";
orexpression += expression;
}
if (!String.IsNullOrEmpty(orexpression))
{
sb.AppendLine("AND (");
sb.AppendLine(orexpression);
sb.AppendLine(")");
}
// result:
// SELECT * FROM products p
// WHERE p.CategoryId > 5
// AND (
// p.productType1 = true OR p.productType2 = true
// )
我在PredicateBuilder上试过了,但在亚音速上出现了一个例外
var query = from p in db.products
select p;
var inner = PredicateBuilder.False<product>();
inner = inner.Or(p => p.productType1 == true);
inner = inner.Or(p => p.productType2 == true);
var result = query.Where(inner);
var query=来自db.products中的p
选择p;
var inner=PredicateBuilder.False();
内部=内部。或(p=>p.productType1==true);
内部=内部。或(p=>p.productType2==true);
var result=query.Where(内部);
引发的异常:NotSupportedException:不支持成员“productType1”
位于SubSonic.DataProviders.MySQL.MySqlFormatter.VisitMemberAccess
任何人都知道如何使用此查询:可能会有所帮助?以下是geocine要求的一个使用示例。 它需要动态Linq
var productTypes = new int[] {1,2,3,4};
var query = from p in db.products
select p;
if (productTypes.Contains(1))
query.Add("productType1 = @0");
if (productTypes.Contains(2))
query.Add("productType2 = @0");
if (productTypes.Contains(3))
query.Add("productType3 = @0");
if (productTypes.Contains(4))
query.Add("productType4 = @0");
if (productTypes.Count > 0)
{
string result = String.Join(" OR ", productTypes);
query = query.Where("(" + result + ")", true);
}
var result = from p in query
select new {Id = p.ProductId, Name = p.ProductName };
它看起来很好,但很管用。是的,很管用。我想有一个更静态的解决方案,我找不到atm。但是动态linq源确实非常强大。谢谢。嗨,SchlaWeiner,我也像你一样构造我的查询。我通常使用它进行过滤、排序和分页。你有一个优雅的方法来做到这一点吗?我添加了一个例子。只需按照Devart提供的链接,下载示例项目并将Dynamic.cs文件添加到您的项目中。为了使用lib,您必须使用System.Linq.Dynamic向代码中添加
。
var productTypes = new int[] {1,2,3,4};
var query = from p in db.products
select p;
if (productTypes.Contains(1))
query.Add("productType1 = @0");
if (productTypes.Contains(2))
query.Add("productType2 = @0");
if (productTypes.Contains(3))
query.Add("productType3 = @0");
if (productTypes.Contains(4))
query.Add("productType4 = @0");
if (productTypes.Count > 0)
{
string result = String.Join(" OR ", productTypes);
query = query.Where("(" + result + ")", true);
}
var result = from p in query
select new {Id = p.ProductId, Name = p.ProductName };