动态Where子句与LINQ to SQL的关系表

时间:2009-03-30 14:03:48

标签: .net linq linq-to-sql dynamic where-clause

我需要帮助LinqToSql中的动态where子句关于关系表(一对多)

用户从页面选择条件。 (用户选择条款有4个输入)

例如来自Customer表的CompanyName和CompanyTitle以及来自Order表的OrderDate和ShipCity。

用户可以从页面界面中选择其中一个,并在代码隐藏时生成动态查询,然后选择From LinqToSql。

您可以从其他网页提供类似类型的示例。

alt text

4 个答案:

答案 0 :(得分:12)

您是否正在寻找类似的内容,您可以在其中定义“基本”查询,然后评估参数以确定where子句是否合适?

var result = (from x in context.X
              select x);

if(some condition)
{
    result = result.AsQueryable().Where(x => x.companyName == name);
}
if(some other condition)
{
    result = result.AsQueryable().Where(x => x.companyTitle == title);
}

//return result.ToList();
//return result.FirstOrDefault();
//return result.Count(); //etc

我在你的一条评论中注意到你提到你的表没有用外键加入?如果没有某种参照完整性或关系,我不确定你如何得到一对多的关系?

答案 1 :(得分:5)

dynamic linq library上查看ScottGu的博客。我认为这会有所帮助。

以下是一个同时命中客户和订单表的查询示例:     

    var query =
    db.Customers.
    Where("City = @0 and Orders.Count >= @1", "London", 10).
    OrderBy("CompanyName").
    Select("new(CompanyName as Name, Phone)");
    

上面的查询来自C# samples for Visual Studio。下载并查看\ LinqSamples \ DynamicQuery文件夹,您将找到更多示例。

答案 2 :(得分:2)

取决于您希望它的动态程度 - 正如其他人已经建议的那样,System.Linq.Dynamic命名空间为编写查询添加了一些简洁的功能,其中涉及的实体/成员(表/列)在设计时是未知的。在这种情况下,它听起来像所涉及的实体和成员已知,并且您只需要在where子句标准之间在不同字段之间切换。这是一个例子:

from cust in dc.Customer
join ord in dc.Order on cust.CustomerID equals ord.CustomerID
where (companyName == null || cust.CompanyName == companyName)
  and (companyTitle == null || cust.CompanyTitle == companyTitle)
  and (orderDate == null || ord.OrderDate == orderDate)
  and (shipCity == null || ord.ShipCity == shipCity)
select new {cust, ord}

答案 3 :(得分:0)

RobS提供了我认为最有吸引力的解决方案。但是,这是我使用的方法,但后来我意识到它实际上是完全执行第一个查询(Linq-To-SQL),然后使用LINQ执行后续.Where()子句。所以这不是一个可行的解决方案,因为整个数据集被枚举,然后在内存中向后过滤。

如果我错了,请纠正我 - 但这是我注意到的。