我需要帮助LinqToSql中的动态where子句关于关系表(一对多)。
用户从页面选择条件。 (用户选择条款有4个输入)
例如来自Customer表的CompanyName和CompanyTitle以及来自Order表的OrderDate和ShipCity。
但用户可以从页面界面中选择其中一个,并在代码隐藏时生成动态查询,然后选择From LinqToSql。
您可以从其他网页提供类似类型的示例。
答案 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()子句。所以这不是一个可行的解决方案,因为整个数据集被枚举,然后在内存中向后过滤。
如果我错了,请纠正我 - 但这是我注意到的。