1

我已经查看了一些关于 SO 的问题并尝试了谷歌,但无法让它发挥作用。我有一个搜索页面,用户可以在其中输入和选择下拉列表,其中填写了 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 语句。想象一下,用户选择foobaz输入42someField框中。搜索应该返回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);

所以 where //1is where 不应该是排他的。换句话说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查询

4

3 回答 3

1

您可以使用Contains相反的方式:

string[] areaSplit = value.Split(',');
entities = entities.Where(x => areaSplit.Contains(x.area)); //1
entities = entities.Where(x => x.someField == value);

这将IN在 sql 的一个子句中翻译:

WHERE (area IN (N'foo', N'baz')) AND (42 = someField)
于 2012-05-30T07:52:51.290 回答
0

伊奥纳斯丹,

我建议您从以下位置查看谓词构建器:

http://www.albahari.com/nutshell/predicatebuilder.aspx

这是一种非常好的综合方法,可以完全按照您的描述构建动态过滤器。

于 2012-05-29T13:08:35.803 回答
-1

伊奥纳斯丹,

在返回查询结果的方法中

public virtual ActionResult QueryWithMultipleParameters(int param1, int param2, int param3, ...)
{
    var query = dataContext.EntityToQuery;

    if(param1 > 0)
    {
        query = query.Where(e => e.param1 == param1);
    }
    if(param2 > 0)
    {
        query = query.Where(e => e.param2 == param2);
    }
    .... etc. 
    return query; 
}

希望这可以帮助。

于 2012-05-29T13:34:16.853 回答