Linq to sql 使用一个具有不同参数的LINQ语句

Linq to sql 使用一个具有不同参数的LINQ语句,linq-to-sql,Linq To Sql,我有一个非常复杂的linq语句,我需要为不同的方法访问它。这些方法中的每一种都可能需要使用不同的参数查看结果数据。对于一种方法,它可能是项目代码,对于另一种方法,它可能是语言。这句话基本上是一样的,只是换了个地方 在不复制整个linq语句的情况下,我一直无法理解如何使用不同的where语句,这对我来说还不够干练 例如(大大简化): 有没有一种方法可以将这两种方法都放在同一个语句中,这样我就可以根据我正在做的事情使用其中一种?我尝试使用if语句来使用where语句中的一个或另一个,但效果不太好。您

我有一个非常复杂的linq语句,我需要为不同的方法访问它。这些方法中的每一种都可能需要使用不同的参数查看结果数据。对于一种方法,它可能是项目代码,对于另一种方法,它可能是语言。这句话基本上是一样的,只是换了个地方

在不复制整个linq语句的情况下,我一直无法理解如何使用不同的where语句,这对我来说还不够干练

例如(大大简化):


有没有一种方法可以将这两种方法都放在同一个语句中,这样我就可以根据我正在做的事情使用其中一种?我尝试使用if语句来使用where语句中的一个或另一个,但效果不太好。

您可以这样做:

var r = from c in customer
        select c;

if (CustomerName != null)
  r = r.Where(c => c.name == CustomerName);
if (CustomerID != null)
  r = r.Where(c => c.customerId == CustomerID);

如果只应用一个条件,则可以将这些条件设置为
,否则在我的示例中,任何不为null的条件都将应用于要筛选的查询。

您可以将
Func
委托传递给您的函数(Where子句接受带有布尔返回类型的
Func
委托)。然后在Where子句中使用此委托。

类似的内容如何

var useIdForFiltering = false;

var r = from c in customer
    where (useIdForFiltering && c.customerId == 8) || (c.name == "some name")

根据r的类型,您可以简单地将
customer
分配给r,甚至可以将Where子句的结果重新分配给customer。这取决于上下文。例如,如果Customers是Table,我认为您可以简单地执行
var r=db.Customers.AsQueryable()
,那么r将是
IQueryable
@tvanfosson-同意,如果是这样一个简单的查询,最好使用这种方法……从问题听起来好像不是。我认为在您的示例中,只要
var r=db.Customers
就可以了,因为
Table:IQueryable
linq语句很复杂,虽然两次或三次迭代之间的唯一区别是where语句。这是一种比Hueso Azul的“更好”的方法吗?@Brettski-我想是的……当你添加更多的where实例时,它只会变得更混乱,这种方法即使在这种情况下也能保持相当的理智,我认为也更容易阅读。。。不过,个人偏好是,做对你来说最容易阅读/维护的事情。
var useIdForFiltering = false;

var r = from c in customer
    where (useIdForFiltering && c.customerId == 8) || (c.name == "some name")