【发布时间】:2012-05-29 12:50:10
【问题描述】:
我已经查看了一些关于 SO 的问题,并尝试了 Google,但未能使其正常工作。我有一个搜索页面,用户可以在其中输入和选择下拉列表,其中填写了 0 到 10 个字段。 (可以返回“所有”结果)。在我有一个允许多项选择的字段之前,它运行良好
<select name="area" size="25" multiple="multiple">
<option>foo</option>
<option>bar</option>
<option>baz</option>
<!--blah blah blah-->
</select>
<input name="someField"/>
我无法将其转换为 EF lambda 语句。假设用户选择foo 和baz 并将42 输入到someField 框中。搜索应该返回area 的结果,其中一个并且具有正确的someField 值。
//...
var entities = db.entities;
//... this is inside of a switch/loop through the forms collection
string value = Request.Form[key];
//...
If (area <> "") {
string[] areaSplit = value.Split(',');
foreach (string s in subSplit)
{
string temp = s;
entities.Where(x => x.area.Contains(temp)); //1
}
}
//...
entities.Where(x => x.someField == value);
所以//1 是不应该排他的地方。换句话说,entities.area 可以具有来自表单字段area 的任何值之一。在 SQL 查询中,我可能会写
... someField = 42 and (area = 'foo' or area = 'baz')
只编写一个 SQL 查询会更好(高效、最佳实践)吗?
编辑使用谓词构建器
var outer = PredicateBuilder.True<entity>();
var inner = PredicateBuilder.False<entity>();
//... this is inside of a switch/loop through the forms collection
string value = Request.Form[key];
//...
string[] areaSplit = value.Split(',');
foreach (string s in subSplit)
{
string temp = s;
inner = inner.Or(x => x.area.Contains(temp)); //1
}
//..
outer = outer.And(x => x.someField == value);
//...end of loop
outer.And(inner.Expand());
var foo = db.entity.AsExpandable().Where(outer.Expand());
但它似乎忽略了inner 部分。 SQL 探查器不显示 inner 查询
【问题讨论】:
标签: asp.net-mvc-3 entity-framework lambda