具有多个 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 个查询,我想知道是否有我在这里缺少的更好的解决方案。

谢谢你帮助我。

具有多个 where 参数的 linq to SQL 查询

如果我理解正确的话。你可能想要这样的东西:

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);
            }
        }

编辑:

我已经编辑了它以适用于所有属性。 当然,您仍然需要一些东西才能正常工作,但是一旦您了解如何使用它,您就可以将其用作所有代码的实用程序,而不是针对每种类型对其进行硬编码