在各种列中搜索的最可维护的方式

时间:2017-01-02 04:21:07

标签: c# sql-server entity-framework linq

一个表有一个Categories列,它包含表示Property,Cars,Others的整数。

下面显示的每个类别都有不同的兴趣列,搜索属性的关键字将集中在PropertyType,State,County和NoOfBaths的列上;关键词搜索汽车将关注品牌,型号,年份等。

所有条目都包含所有列中的数据,但不同类别的数据有时可能略有不同。例如,PropertyType列包含汽车的CarType数据和其他的ItemType数据,但这些列仅在搜索属性时才有意义。

属性
属性类型,
位置状态,
位置县,
没有浴场

汽车
制作,
型号,
今年,
位置状态

其他
ITEMNAME,
制作,
颜色,
位置状态

出于性能原因,感兴趣的列仅限于四列。 UI中使用单个搜索文本框,就像谷歌一样。在查询被触发之前用于预先识别用户的搜索类别的算法发布了可接受的98%准确率。该算法还可以很好地猜测颜色,状态,县等。 该网站最初是使用c#,实体框架,SQL服务器开发的小型广告网站。

由于它被认为是一个小项目,我想我可以将linq与实体联系起来。使用if语句来消除空字段,对于每个类别,它们是有限数量的查询(功率4的2)。

EG。 1

以及queryHelper的一些列表

其中在组成where子句之前检查null值。

当我完成时,我不确定这样的小项目是否值得这种逻辑,即使它看起来更灵活和可维护。感兴趣的列可以在不影响代码的情况下进行更改。

问题是,是否有更简单的方法来实现这一目标?

其次,为什么linq中没有'Ignorable()'函数,如果被比较的值为null或为空,则可以忽略where子句的给定部分?

EG。 1修改

var results = context.Items.Where(m=>m.make.Ignorable() == make && 
m.model.Ignorable() == model && m.year.Ignorable() ==year && 
m.state.Ignorable() == state);

...

或者是一个符号,比如说'¬',它实现了同样的效果 例如。 1修改

var results = context.Items.Where(m=>m.make ¬== make && m.model ¬== model 
&& m.year ¬==year && m.state ¬== state);

...

2 个答案:

答案 0 :(得分:0)

我认为这样做的更容易和可维护的方法是特定类中的overrided Equals()方法。因此,属性中的任何更改都不需要更改Linq查询。让我在示例类的帮助下解释一下,让它成为类Cars,考虑类的定义将是这样的:

public class Cars
{    
     // Properties      
     public string Make { get; set; }
     public string Model { get; set; }
     public int Year { get; set; }
     public string Location_State { get; set; }

     // overrided  Equals method definition
     public override bool Equals(object obj)
     {
         return this.Equals(obj as Cars);
     }
     public bool Equals(Cars other)
     {
         if (other == null)
             return false;
         return (this.Make == other.Make) &&
                (this.Model == other.Model) &&
                (this.Year == other.Year) &&
                (this.Location_State == other.Location_State);
     }
}

现在让objCars成为您想要与context.Items中的汽车进行比较的对象,然后您可以像这样格式化LINQ查询:

context.Items.Where(m=> m.Equals(objCars));

注意:您可以在N方法中提供Equals条件数,以便在执行前每次都可以避免检查为空或空或其他任何内容LINQ甚至LINQ。轻松地对类进行属性更改,您只需要在overrieded方法中更改条件

答案 1 :(得分:0)

 var q = context.Items;
        if (!string.IsNullOrEmpty(make))
        {
            q = q.Where(m => m.make == make);
        }
        if (!string.IsNullOrEmpty(model))
        {
            q = q.Where(m => m.model == model);
        }
        //. . .

        var results = q.ToList();

在执行之前,可以在多行中操作查询。见here