Linq to实体Where或子句
我已经阅读了其他类似问题的回复,但我不能使用PredicateBuilder,也不能复制它的源代码。我正在尝试我在这里读到的内容: < 但由于我是新手,我在把我读的东西翻译成我申请的东西时遇到了麻烦。我创建了一个L2E查询,并尝试将一系列OR子句附加到WHERE上: 因此,作为简化的代码段,此代码段将与前面已定义的WHERE子句结合使用:Linq to实体Where或子句,linq,c#-4.0,linq-to-entities,where-clause,Linq,C# 4.0,Linq To Entities,Where Clause,我已经阅读了其他类似问题的回复,但我不能使用PredicateBuilder,也不能复制它的源代码。我正在尝试我在这里读到的内容:
if (firstParm == "realtor")
query = query.Where(x=> x.A == "realtor");
现在正在尝试或:
if (secondParm == "clown")
// how to add this one as an OR to the above query:
query = query.OR(x=> x.fool == "clown");
我理解,使用Union也可以做到这一点,但不清楚语法:
query = query.Union(x=> x.fool == "clown"); // ??
我还提到:
但是,我对LINQ,尤其是表达式树是新手,所以需要更多的填充。或者您可以尝试
if (secondParm == "clown")
{
query = query.Where(x=> x.fool == "clown" || x.fool==x.fool);
}
或
或者你可以试试
if (secondParm == "clown")
{
query = query.Where(x=> x.fool == "clown" || x.fool==x.fool);
}
或
有两种方法可以生成表达式 使用编译器来完成它
Expression<Func<Person, bool>> = p => p.LastName.Contains("A");
或者,可以使用静态方法动态创建表达式:
使用System.Linq.Expressions添加;使用静态System.Linq.Expressions.Expression;到文件的顶部
Expression expr;
var parameter = Parameter(typeof(Record));
if (firstParam == "realtor") {
expr = Equals(
MakeMemberAccess(parameter, typeof(Record).GetProperty("A")),
Constant("realtor")
);
}
if (secondParam == "clown") {
var exprClown = Equals(
MakeMemberAccess(parameter, typeof(Record).GetProperty("fool")),
Constant("clown")
);
if (expr == null) {
expr = exprClown;
} else {
expr = Or(expr, exprClown);
}
}
var lambda = Lambda<Func<Record,bool>>(expr, new [] {parameter});
var ctx = new MyDbContext();
var qry = ctx.Records.Where(lambda).Select(x => new {x.A, x.fool});
有两种方法可以生成表达式 使用编译器来完成它
Expression<Func<Person, bool>> = p => p.LastName.Contains("A");
或者,可以使用静态方法动态创建表达式:
使用System.Linq.Expressions添加;使用静态System.Linq.Expressions.Expression;到文件的顶部
Expression expr;
var parameter = Parameter(typeof(Record));
if (firstParam == "realtor") {
expr = Equals(
MakeMemberAccess(parameter, typeof(Record).GetProperty("A")),
Constant("realtor")
);
}
if (secondParam == "clown") {
var exprClown = Equals(
MakeMemberAccess(parameter, typeof(Record).GetProperty("fool")),
Constant("clown")
);
if (expr == null) {
expr = exprClown;
} else {
expr = Or(expr, exprClown);
}
}
var lambda = Lambda<Func<Record,bool>>(expr, new [] {parameter});
var ctx = new MyDbContext();
var qry = ctx.Records.Where(lambda).Select(x => new {x.A, x.fool});
您在使用PredicateBuilder时遇到问题?或者你因为其他原因不能使用它?我不能引入第三方软件:-已更新。你在使用PredicateBuilder时遇到问题?或者你因为其他原因不能使用它?我不能引入第三方s/w:-更新。因为我将与查询的属性进行比较,所以我不清楚上面的记录类型应该放什么。typeT是由select创建的虚拟记录,我正试图将WHERE或子句连接到该记录上。希望这是有道理的:--newb@frododot您能说明一下您是如何创建查询的吗?您使用的是匿名类型还是其他类型?它是匿名的:var query=from。。。where…select new{…}@frodododot 2 options-1您可以使用方法语法并在select之前应用where,并且记录将是您在select之前使用的任何类型;或2个匿名类型是实际类型,但具有编译器指定的名称,因此可以使用反射提取类型并从中继续。我已将答案更新为使用1。如果1不是一个选项,我将使用2更新我的答案以显示。@frododot Updated。因为我将与查询的属性进行比较,所以我不清楚上面的记录类型应该放什么。typeT是由select创建的虚拟记录,我正试图将WHERE或子句连接到该记录上。希望这是有道理的:--newb@frododot您能说明一下您是如何创建查询的吗?您使用的是匿名类型还是其他类型?它是匿名的:var query=from。。。where…select new{…}@frodododot 2 options-1您可以使用方法语法并在select之前应用where,并且记录将是您在select之前使用的任何类型;或2个匿名类型是实际类型,但具有编译器指定的名称,因此可以使用反射提取类型并从中继续。我已将答案更新为使用1。如果1不是选项,我将使用2更新我的答案以显示。@frododot更新。