C# 连接LINQ(到SQL)查询

C# 连接LINQ(到SQL)查询,c#,linq,linq-to-sql,C#,Linq,Linq To Sql,我正在构建一个LINQ查询,它将把比较附加到“where”部分。这些比较的数量取决于用户的选择 在代码背后,我想要这样的东西: var builtQuery = from q in dc.Leads join sr in dc.SalesReps on q.SalesRepID equals sr.SalesRepID join co in dc.Companies on q.CompanyID equals co.C

我正在构建一个LINQ查询,它将把比较附加到“where”部分。这些比较的数量取决于用户的选择

在代码背后,我想要这样的东西:

var builtQuery =
             from q in dc.Leads
             join sr in dc.SalesReps on q.SalesRepID equals sr.SalesRepID
             join co in dc.Companies on q.CompanyID equals co.CompanyID
             join or in dc.Origins on q.OriginID equals or.OriginID
             join pr in dc.Products on q.ProductID equals pr.ProductID
             where
在这里,在“from”和“select”部分之间,我将根据用户选择的复选框添加一些比较

最后:

select new { q.Ref, sr.Rep, q.Deposit, q.Sale, q.Title, q.Names, q.Surname, q.HomePhone, q.WorkPhone, q.Mobile, q.Address, q.Suburb, q.County, q.Postcode, co.CompanyName, or.OriginName, pr.ProductName, q.Telemarket, q.Entered };
在使用MySQL的PHP中,我可以简单地连接一些字符串,这些字符串构成了查询。但是,在c/LINQtoSQL中,查询不是字符串,所以我不知道如何做……有几个类似的问题,但它们不是完全相同的东西

有什么想法吗


谢谢

我会用下面的方法来做

var intermediateQuery=
         from q in dc.Leads
         join sr in dc.SalesReps on q.SalesRepID equals sr.SalesRepID
         join co in dc.Companies on q.CompanyID equals co.CompanyID
         join or in dc.Origins on q.OriginID equals or.OriginID
         join pr in dc.Products on q.ProductID equals pr.ProductID

 select new { q.Ref, sr.Rep, q.Deposit, q.Sale, q.Title, q.Names, q.Surname,             q.HomePhone, q.WorkPhone, q.Mobile, q.Address, q.Suburb, q.County, q.Postcode, co.CompanyName, or.OriginName, pr.ProductName, q.Telemarket, q.Entered };
然后添加一些考虑用户输入的过滤器

if(SomeUserProductFilter)
  {
     var result = intermediateQuery.Where(p=>p.ProductName = 'UserProductName');
  }

不要担心这种方法会检索所有数据,然后将其过滤到内存中。LINQ只在您调用ToList、ToArray或在foreach循环中使用result时才将查询发送到数据库

var intermediateQuery=
         from q in dc.Leads
         join sr in dc.SalesReps on q.SalesRepID equals sr.SalesRepID
         join co in dc.Companies on q.CompanyID equals co.CompanyID
         join or in dc.Origins on q.OriginID equals or.OriginID
         join pr in dc.Products on q.ProductID equals pr.ProductID

 select new { q.Ref, sr.Rep, q.Deposit, q.Sale, q.Title, q.Names, q.Surname,             q.HomePhone, q.WorkPhone, q.Mobile, q.Address, q.Suburb, q.County, q.Postcode, co.CompanyName, or.OriginName, pr.ProductName, q.Telemarket, q.Entered };
然后添加一些考虑用户输入的过滤器

if(SomeUserProductFilter)
  {
     var result = intermediateQuery.Where(p=>p.ProductName = 'UserProductName');
  }

不要担心这种方法会检索所有数据,然后将其过滤到内存中。LINQ只在您调用ToList、ToArray或在foreach循环中使用result时才将查询发送到数据库

var intermediateQuery=
         from q in dc.Leads
         join sr in dc.SalesReps on q.SalesRepID equals sr.SalesRepID
         join co in dc.Companies on q.CompanyID equals co.CompanyID
         join or in dc.Origins on q.OriginID equals or.OriginID
         join pr in dc.Products on q.ProductID equals pr.ProductID

 select new { q.Ref, sr.Rep, q.Deposit, q.Sale, q.Title, q.Names, q.Surname,             q.HomePhone, q.WorkPhone, q.Mobile, q.Address, q.Suburb, q.County, q.Postcode, co.CompanyName, or.OriginName, pr.ProductName, q.Telemarket, q.Entered };
然后添加一些考虑用户输入的过滤器

if(SomeUserProductFilter)
  {
     var result = intermediateQuery.Where(p=>p.ProductName = 'UserProductName');
  }

不要担心这种方法会检索所有数据,然后将其过滤到内存中。LINQ只在您调用ToList、ToArray或在foreach循环中使用result时才将查询发送到数据库

var intermediateQuery=
         from q in dc.Leads
         join sr in dc.SalesReps on q.SalesRepID equals sr.SalesRepID
         join co in dc.Companies on q.CompanyID equals co.CompanyID
         join or in dc.Origins on q.OriginID equals or.OriginID
         join pr in dc.Products on q.ProductID equals pr.ProductID

 select new { q.Ref, sr.Rep, q.Deposit, q.Sale, q.Title, q.Names, q.Surname,             q.HomePhone, q.WorkPhone, q.Mobile, q.Address, q.Suburb, q.County, q.Postcode, co.CompanyName, or.OriginName, pr.ProductName, q.Telemarket, q.Entered };
然后添加一些考虑用户输入的过滤器

if(SomeUserProductFilter)
  {
     var result = intermediateQuery.Where(p=>p.ProductName = 'UserProductName');
  }

不要担心这种方法会检索所有数据,然后将其过滤到内存中。LINQ仅当您在foreach循环中调用ToList、ToArray或use result时才将查询发送到数据库

您可以使用表达式树:通过使用字符串,您实际上想要实现什么?这是用户将要选择的内容吗。。还是动态查询?否则,字符串方式将和您已经拥有的一样冗长。但是,字符串是可能的-转换字符串连接以创建SQL只需要一点工作,这是一个导致SQL注入攻击的错误。即使在PHP中,您也应该使用参数化查询,而不要使用字符串连接。@PanagiotisKanavos您可以使用完全安全的字符串连接构建参数化查询,例如query=query+where x=@x'是安全的,而query=query+where x=+x不是安全的。此外,这是Linq连接,Linq不会受到注入攻击。如果你不能使用Linq并且需要一个动态查询,你需要字符串连接,只要安全地使用它就行了。你可以使用表达式树:你到底想通过使用字符串实现什么?这是用户将要选择的内容吗。。还是动态查询?否则,字符串方式将和您已经拥有的一样冗长。但是,字符串是可能的-转换字符串连接以创建SQL只需要一点工作,这是一个导致SQL注入攻击的错误。即使在PHP中,您也应该使用参数化查询,而不要使用字符串连接。@PanagiotisKanavos您可以使用完全安全的字符串连接构建参数化查询,例如query=query+where x=@x'是安全的,而query=query+where x=+x不是安全的。此外,这是Linq连接,Linq不会受到注入攻击。如果你不能使用Linq并且需要一个动态查询,你需要字符串连接,只要安全地使用它就行了。你可以使用表达式树:你到底想通过使用字符串实现什么?这是用户将要选择的内容吗。。还是动态查询?否则,字符串方式将和您已经拥有的一样冗长。但是,字符串是可能的-转换字符串连接以创建SQL只需要一点工作,这是一个导致SQL注入攻击的错误。即使在PHP中,您也应该使用参数化查询,而不要使用字符串连接。@PanagiotisKanavos您可以使用完全安全的字符串连接构建参数化查询,例如query=query+where x=@x'是安全的,而query=query+where x=+x不是安全的。此外,这是Linq连接,Linq不会受到注入攻击。如果你不能使用Linq并且需要一个动态查询,你需要字符串连接,只要安全地使用它就行了。你可以使用表达式树:你到底想通过使用字符串实现什么?这是用户将要选择的内容吗。。还是动态查询?否则,字符串方式将和您已经拥有的一样冗长。但是,字符串是可能的-转换字符串连接以创建SQL只需要一点工作,这是一个导致SQL注入攻击的错误。即使在PHP中,也应该使用参数化查询,而不要使用字符串连接。@PanagiotisKanavos您可以使用字符串连接构建一个完全安全的参数化查询, e、 g.query=query+where x=@x'是安全的,而query=query+where x=+x不是安全的。此外,这是Linq连接,Linq不会受到注入攻击。如果您不能使用Linq并且需要一个动态查询,那么您将需要字符串连接,只需安全地执行即可。