Linq其中表达式作为要添加的值

时间:2018-11-13 09:08:16

标签: c# linq .net-4.5

我对格式化LINQ查询有疑问

我对同一查询使用不同的where选项

例如:

var result = context.table.Include(x => x.table2).Where(q => q1);

查询是相同的,但是在不同的情况下,我在q1,q2,q3之类的表达式上有不同

我可以分别配置q个对象并在查询中使用它吗

var q1 = (q => q.x == "something");
var q2 = (q => q.x == "something2");
var q3 = (q => q.x == "something3");

var qx;
if(x)
{
    qx = q1;
}
if(y)
{
    qx = q2;
}

var result = context.table.Include(x => x.table2).Where(q => qx);

4 个答案:

答案 0 :(得分:0)

不完全是。您需要做类似的事情

var result = context.table.Include(x => x.table2).Where(qx);

因为q1q2等已经与.Where()期望的表达式兼容。

答案 1 :(得分:0)

IQueryable.Where接受Expression<Func<TSource, bool>>,您可以执行以下操作:

Expression<Func<SourceType, bool>> qx = q => false;
Expression<Func<SourceType, bool>> q1 = q => q.x == "something";

答案 2 :(得分:0)

在回答之前,请注意,您不能像这样声明qx

var qx;

因为编译器不会立即解析类型。 如果您指定q的类型,那么您要问的是可能的。

Func<type, bool> q1 = (type q) => q.x == "something";
Func<type, bool> q2 = (type q) => q.x == "something2";
Func<type, bool> q3 = (type q) => q.x == "something3";

Func<type, bool> qx = q3; //this needs a value (if x and y are false)
if(x)
{
   qx = q1;
}
if(y)
{
   qx = q2;
}

var result = context.table.Include(x => x.table2).Where(qx);

答案 3 :(得分:-1)

您似乎需要一个查询,其中在运行时提供了实际条件。只需使用Predicate

Predicate<MyType> predicate;
if(x)
{
    predicate = q => q.x == "something";
}
else if(y)
{
    predicate = q => q.x == "something2";
}
else
    predicate = q => q.x == "something3";
var result = context.table.Include(x => x.table2).where(predicate);