C# 将LINQ到SQL中的多个复杂WHERE子句链接在一起

C# 将LINQ到SQL中的多个复杂WHERE子句链接在一起,c#,linq,linq-to-sql,linq-to-entities,C#,Linq,Linq To Sql,Linq To Entities,这是我要生成的伪SQL: SELECT * FROM Table WHERE Column1 = @Value1 OR Column2 = @Value2 问题是,有时第二个不应该包括在内。我希望将.Where()这样的子句链接在一起: var query = context.TableName; query = query.Where(t => t.Column1 == value1); if (NeedsToBeIncluded(value2)) query = query.Wh

这是我要生成的伪SQL:

SELECT * FROM Table WHERE Column1 = @Value1 OR Column2 = @Value2
问题是,有时第二个不应该包括在内。我希望将
.Where()
这样的子句链接在一起:

var query = context.TableName;
query = query.Where(t => t.Column1 == value1);
if (NeedsToBeIncluded(value2))
  query = query.Where(t => t.Column2 == value2);
不幸的是,这不起作用
.Where()
将发出一个
,如果默认情况下将它们链接在一起。有没有办法让它发出

我正在寻找以下线索:

var query = context.TableName;
query = query.Where(t => t.Column1 == value1);
if (NeedsToBeIncluded(value2))
  query = query.OrWhere(t => t.Column2 == value2);
更新
好的,我上面列出的例子太简单了。这只是一个概括问题空间的例子。可以说,在《野外》中,专栏1和专栏2实际上可能是“CarType”和“OwnerName”,可能更多,也可能更少。我只是用了一个简单的例子来概括这个问题,因为我想用这个链接来解决一系列域问题-
.Where()
s结合在一起。

我昨天给出了一个如何动态构建条件的例子-请参阅。就你的情况来说,应该是这样的

var parameter = Expression.Parameter(typeof(TableName), "t");

Expression condition = Expression.Equal(
    Expression.Property(parameter, "Column1"),
    Expression.Constant(value1)));

if (NeedsToBeIncluded(value2))
{
    condition = Expression.OrElse(
        condition,
        Expression.Equal(
            Expression.Property(parameter, "Column2"),
            Expression.Constant(value2)));
}

var expression = Expression.Lambda<Func<TableName, Boolean>>(condition, parameter);

var query = context.TableName.Where(expression);
var parameter=Expression.parameter(typeof(TableName),“t”);
表达式条件=表达式。相等(
Expression.Property(参数“Column1”),
表达式。常数(值1));
如果(需要包括在内(值2))
{
条件=表达式.OrElse(
条件
表达式。相等(
Expression.Property(参数“Column2”),
表达式。常数(值2));
}
var expression=expression.Lambda(条件、参数);
var query=context.TableName.Where(表达式);

一种方法是使用LINQKit的

另一种方法是使用列表:

var values = new List<string> { value1 };
if (NeedsToBeIncluded(value2)) values.Add(value2);
query = context.TableName.Where(t => values.Contains(t));
var values=新列表{value1};
如果(需要包括(值2))值。添加(值2);
query=context.TableName.Where(t=>values.Contains(t));

PB更灵活,但列表将解决您问题中的问题。请注意,对于
Contains

+1,您需要EF4,对于其余部分,我已经使用过PredicateBuilder一次,但完全忘记了它。