Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linq to实体Where或子句_Linq_C# 4.0_Linq To Entities_Where Clause - Fatal编程技术网

Linq to实体Where或子句

Linq to实体Where或子句,linq,c#-4.0,linq-to-entities,where-clause,Linq,C# 4.0,Linq To Entities,Where Clause,我已经阅读了其他类似问题的回复,但我不能使用PredicateBuilder,也不能复制它的源代码。我正在尝试我在这里读到的内容:

我已经阅读了其他类似问题的回复,但我不能使用PredicateBuilder,也不能复制它的源代码。我正在尝试我在这里读到的内容:

<

但由于我是新手,我在把我读的东西翻译成我申请的东西时遇到了麻烦。我创建了一个L2E查询,并尝试将一系列OR子句附加到WHERE上:

因此,作为简化的代码段,此代码段将与前面已定义的WHERE子句结合使用:

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更新。