我有一个数据库,其用户搜索屏幕是“动态的”,因为我可以根据搜索所基于的特定视图中的可用列来动态添加其他搜索条件,并允许用户立即使用它们。以前我一直在使用nettiers这个数据库,但现在我正在使用RIA和EntFramework 4和LINQ编写一个新的应用程序。
我目前有两个用于此的表,一个用可用的搜索字符串模式填充组合框:
名字 LastName,FirstName 电话 等....
然后我有另一个表将这些标准拆分出来并用于我的nettiers算法。它运行良好,但我想使用LINQ ..它不适合这个模型。除此之外,我想我可以把它简化为只有一张带linq的桌子......
使用类似于此的格式或非常接近的格式......
ID标准WhereClause 1 LastName'Lamesname Like'%{0}%'
现在我知道这不适合专门用于linq查询..但我在这里尝试使用通用语法来清晰...
真正的where子句看起来像这样:a => a.LastName.Contains(“{0}”)
我的第一个问题是:这甚至可能吗?将lambda输入字符串并在Linq查询中使用它?
我的第二个问题是:在我研究这个问题之前,我发现了一个具有类似it.LastName {0}的前缀的linq语法。 我似乎已经尝试使用它,因为它的痕迹仍在我的测试数据库中...但我不知道回想起我在哪里阅读它。
有人这样做吗?我做了一些搜索并发现了类似的情况,但它们大多数都是可选的静态字段,而不是我正在做的方式......
答案 0 :(得分:1)
至于你的第一个问题,你可以使用Scott Guq所描述的动态Linq here
var query = Northwind.Products.Where("Lastname LIKE "test%");
答案 1 :(得分:1)
我不确定您的动态查询需要多详细,但是当我需要进行动态查询时,我创建了一个表示过滤器值的类。然后我将该类传递给我的存储库中的搜索方法。如果字段的值为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();
}