6

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

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

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

但是用户可以从页面界面中选择其中的一个或多个,并且将在代码隐藏处生成动态查询并选择 From LinqToSql。

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

替代文字

4

4 回答 4

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

我在您的一条评论中注意到您提到您的表没有通过外键连接?我不确定在没有某种参照完整性或关系的情况下如何获得一对多关系?

于 2009-03-31T14:49:38.720 回答
5

查看 ScottGu 关于动态 linq 库的博客。我认为这会有所帮助。

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

    变种查询 =
    db.客户。
    Where("City = @0 and Orders.Count >= @1", "London", 10).
    OrderBy(“公司名称”)。
    Select("new(CompanyName as Name, Phone)");
    

上面的查询来自Visual Studio 的 C# 示例。下载并查看 \LinqSamples\DynamicQuery 文件夹,您会发现更多示例。

于 2009-03-30T14:08:51.727 回答
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}
于 2009-03-31T05:05:47.813 回答
0

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

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

于 2010-06-23T12:19:50.610 回答