用于用户搜索屏幕的Linq动态查询
我有一个数据库,它有一个“动态”的用户搜索屏幕,我可以根据搜索所基于的特定视图中的可用列动态添加其他搜索条件,并允许用户立即使用它们。以前我一直在使用nettiers来处理这个数据库,但现在我正在使用RIA、EntFramework4和LINQ针对它编写一个新的应用程序 我目前有两个用于此目的的表,其中一个用可用的搜索字符串模式填充组合框: 姓氏 姓 电话 等等 然后我有另一个表,将这些标准拆分出来,并用于我的nettiers算法。它工作得很好,但我想使用LINQ,而且它不太适合这个模型。除此之外,我想我可以减少到只有一张桌子和林克 使用与此类似的格式或非常接近的格式 身份证标准条款 1 LastName“LastName类似“{0}%” 现在我知道这不适合linq查询…但是为了清晰起见,我尝试使用统一的语法 实where子句看起来像这样:a=>a.LastName.Contains(“{0}”) 我的第一个问题是:这可能吗?将lambda输入字符串并在Linq查询中使用它 我的第二个问题是:在研究这个问题之前,我发现了一个linq语法,它有一个类似的前缀。LastName{0} 我似乎尝试过使用它,因为它的痕迹仍然存在于我的测试数据库中……但我不知道我在哪里读到过它用于用户搜索屏幕的Linq动态查询,linq,entity-framework,linq-to-entities,linq-to-objects,Linq,Entity Framework,Linq To Entities,Linq To Objects,我有一个数据库,它有一个“动态”的用户搜索屏幕,我可以根据搜索所基于的特定视图中的可用列动态添加其他搜索条件,并允许用户立即使用它们。以前我一直在使用nettiers来处理这个数据库,但现在我正在使用RIA、EntFramework4和LINQ针对它编写一个新的应用程序 我目前有两个用于此目的的表,其中一个用可用的搜索字符串模式填充组合框: 姓氏 姓 电话 等等 然后我有另一个表,将这些标准拆分出来,并用于我的nettiers算法。它工作得很好,但我想使用LINQ,而且它不太适合这个模型。除此之
有人这样做吗?我做了一些搜索,发现了类似的情况,但它们大多有可选的静态字段,这与我的做法不完全一样…至于你的第一个问题,你可以使用Scott Gu描述的动态Linq来完成
我不确定动态查询需要多详细,但当我需要进行动态查询时,我会创建一个类来表示过滤器值。然后我将该类传递给存储库中的搜索方法。如果字段的值为null,则查询将忽略它。如果它有一个值,它会添加相应的过滤器
public class CustomerSearchCriteria{
public string LastName { get; set; }
public string FirstName { get; set; }
public string PhoneName { get; set; }
}
public IEnumberable<Customer> Search(CustomerSearchCriteria criteria){
var q = db.Customers();
if(criteria.FirstName != null){
q = q.Where(c=>c.FirstName.Contains(criteria.FirstName));
}
if(criteria.LastName!= null){
q = q.Where(c=>c.LastName.Contains(criteria.LastName));
}
if(criteria.Phone!= null){
q = q.Where(c=>c.Phone.Contains(criteria.Phone));
}
return q.AsEnumerable();
}
公共类客户搜索标准{
公共字符串LastName{get;set;}
公共字符串名{get;set;}
公共字符串PhoneName{get;set;}
}
公共IEnumberable搜索(CustomerSearchCriteria条件){
var q=db.Customers();
if(criteria.FirstName!=null){
q=q.Where(c=>c.FirstName.Contains(criteria.FirstName));
}
if(criteria.LastName!=null){
q=q.Where(c=>c.LastName.Contains(criteria.LastName));
}
if(criteria.Phone!=null){
q=q.Where(c=>c.Phone.Contains(criteria.Phone));
}
返回q.AsEnumerable();
}
如上所述,应用程序不知道查询条件的内容,如果我选择根据我的视图添加额外的条件选择,我还必须编辑我的代码。我不想这样做。这是最接近的解决方案。实际上,您必须将其更改为var query=Products.Where(“Lastname.Contains”(“test”);否则您将得到一个不返回布尔值的错误。
public class CustomerSearchCriteria{
public string LastName { get; set; }
public string FirstName { get; set; }
public string PhoneName { get; set; }
}
public IEnumberable<Customer> Search(CustomerSearchCriteria criteria){
var q = db.Customers();
if(criteria.FirstName != null){
q = q.Where(c=>c.FirstName.Contains(criteria.FirstName));
}
if(criteria.LastName!= null){
q = q.Where(c=>c.LastName.Contains(criteria.LastName));
}
if(criteria.Phone!= null){
q = q.Where(c=>c.Phone.Contains(criteria.Phone));
}
return q.AsEnumerable();
}