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

Jus*_*ren 4 c# linq linq-to-entities linq-to-sql

这是我想要生成的伪SQL:

SELECT * FROM Table WHERE Column1 = @Value1 OR Column2 = @Value2
Run Code Online (Sandbox Code Playgroud)

问题是,有时不应包括第二个.我希望将这些.Where()条款链接在一起:

var query = context.TableName;
query = query.Where(t => t.Column1 == value1);
if (NeedsToBeIncluded(value2))
  query = query.Where(t => t.Column2 == value2);
Run Code Online (Sandbox Code Playgroud)

不幸的是,这不起作用. 如果你.Where()AND它们链接在一起默认会发出一个.有没有办法让它发出OR

我正在寻找以下内容:

var query = context.TableName;
query = query.Where(t => t.Column1 == value1);
if (NeedsToBeIncluded(value2))
  query = query.OrWhere(t => t.Column2 == value2);
Run Code Online (Sandbox Code Playgroud)

更新 好的,所以我上面列出的例子太简单了.它只是一个概述问题空间的例子.可以说,"在野外",Column1和Column2实际上可能是"CarType"和"OwnerName",也许还有更多,也许还有更少.我只是用一个简单的例子来概述问题,因为我希望用这个链接来解决一系列域问题.Where().

Cra*_*ntz 10

一种方法是使用LINQKit的PredicateBuilder.

另一种方法是使用列表:

var values = new List<string> { value1 };
if (NeedsToBeIncluded(value2)) values.Add(value2);
query = context.TableName.Where(t => values.Contains(t));
Run Code Online (Sandbox Code Playgroud)

PB更灵活,但列表将解决您问题中的问题.请注意,您需要EF 4 Contains.