linq to sql query with multiple where参数

who*_*res 12 c# sql linq asp.net-mvc entity-framework

我目前正在使用实体框架在ASP.NET MVC 4中编写搜索功能.但是,我遇到了障碍,我只能找到"坏"的解决方案.

我的搜索功能返回一个由4个参数组成的模型:

String Name
String Street
String Code
String Province

List<Query> query = (from t in Model select t).ToList();
Run Code Online (Sandbox Code Playgroud)

现在我想过滤我的搜索输入.但是,用户可以决定填写尽可能多的搜索字段.他可以决定使用姓名和街道,或姓名,街道和省份,或......

我能找到的唯一真正的解决方案包括进行查询并IQueryable检查字段是否已填充if,然后使用a .Where来更新查询.由于目前这将提供m 5个查询,我想知道是否有更好的解决方案,我在这里缺少.

谢谢你的帮助.

Ari*_*ion 22

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

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();
Run Code Online (Sandbox Code Playgroud)

你将有一个IQueryable添加where语句的时间,当你执行时ToList(),sql将执行.

更新

回答路易斯·埃尔南德斯的评论.这就是它的工作原理.在这种情况下,从模型中选择集合类型时IQueryable.这意味着它尚未针对数据库执行.要执行查询,您需要应用一些最终的metod.告诉linq它实际上会进行数据库调用.这些是例如

ToList()
FirstOrDefault()
SingleOrDefault()
Single()
First()
ToDictionary() 
Run Code Online (Sandbox Code Playgroud)

所以当我们在不使用的情况下附加Where子句时ToList().没有执行查询.

请在LinqPad中尝试查询