具有多个 where 参数的 linq to SQL 查询
本文关键字:linq to SQL 查询 参数 where | 更新日期: 2023-09-27 18:31:24
我目前正在使用实体框架在 ASP.NET MVC 4 中编写搜索函数。但是,我遇到了一个障碍,我只能找到"坏"的解决方案。
我的搜索函数返回一个由 4 个参数组成的模型:
String Name
String Street
String Code
String Province
List<Query> query = (from t in Model select t).ToList();
现在我想过滤我的搜索输入。但是,用户可以决定填写尽可能多的搜索字段。他可以决定使用名称和街道,或名称,街道和省份,或......
我能够找到的唯一真正的解决方案包括进行查询和IQueryable
,并检查字段是否已填充if
,然后使用.Where
更新查询。由于这目前会给出 m 5 个查询,我想知道是否有我在这里缺少的更好的解决方案。
谢谢你帮助我。
如果我理解正确的话。你可能想要这样的东西:
string Name;
string Street;
string Code;
string Province;
var query=(from t in Model select t);
if(Name!=null)
{
query=query.Where (q =>q.Name==Name);
}
if(Street!=null)
{
query=query.Where (q =>q.Street==Street);
}
if(Code!=null)
{
query=query.Where (q =>q.Code==Code);
}
if(Province!=null)
{
query=query.Where (q =>q.Province==Province);
}
List<Query> ls = query.ToList();
当您添加 where 语句以及执行 sql 将执行的ToList()
时,您将有一个IQueryable
。
更新
回答路易斯·埃尔南德斯的评论。所以这就是它的工作原理。在这种情况下,从模型中进行选择时,集合类型为 IQueryable
。这意味着它尚未针对数据库执行。要执行查询,您需要应用一些最终的 metod。告诉 linq 它实际上将执行数据库调用。这些是例如
ToList()
FirstOrDefault()
SingleOrDefault()
Single()
First()
ToDictionary()
因此,当我们在不使用 Where 的情况下附加 Where 子句时 ToList()
.不执行查询。
请尝试在 LinqPad 中查询
使用您在此处找到的实体筛选器类:https://servicelayerhelpers.codeplex.com/SourceControl/changeset/view/32810#537055
因此,首先指定您的过滤器,然后将其应用于您的查询。
例:
var filter = EntityFilter
.Where(c => c.Name == came)
.Where(c => c.City == city);
var customers = FindCustomers(filter);
Customer[] FindCustomers(IEntityFilter filter)
{
var query = context.Customers;
query = filter.Filter(query);
return query.ToArray();
}
更多信息: https://cuttingedge.it/blogs/steven/pivot/entry.php?id=66
你试试这样的事情
from cars in tblCars
where (cars.colorID == 1) && (cars.Wieght > 500) && (cars.Active == true)
select cars;
Arion 的解决方案当然非常好,我试图使用反射让它减少重复,希望对您有所帮助。
Type myType = myObject.GetType();
IList<PropertyInfo> props = new List<PropertyInfo>(myType.GetProperties());
foreach (PropertyInfo prop in props)
{
object propValue = prop.GetValue(myObject, null);
if (propValue != null)
{
query = query.Where(q => prop.GetValue(q, null) == propValue);
}
}
编辑:
我已经编辑了它以适用于所有属性。 当然,您仍然需要一些东西才能正常工作,但是一旦您了解如何使用它,您就可以将其用作所有代码的实用程序,而不是针对每种类型对其进行硬编码