linq和运营商问题

时间:2015-03-03 05:03:44

标签: c# linq linq-to-sql

我有像这样的查询linq到

  forms = attributesData.Where(x => x.strValue.ToLower().Contains(ddlProvince.SelectedItem.Text.ToLower())
            && x.attributeName == "Province"
            && (x.attributeName=="District" && x.strValue==ddlDistrict.SelectedItem.Text)
            && (x.attributeName == "TrainingProgram Code" && x.strValue==ddlSearch.Text)
            && (x.attributeName == "Father Name" && x.strValue==txtform.Text)

            ).Select(t => t.strFormId).Distinct().ToList();

问题是我的数据库中只有strvalue列,它存储了每个信息,现在我必须应用多次搜索操作,如果我应用并且运算符查询返回null。但是如果我应用或运算符查询返回值但我需要结果和操作员不是或操作员请帮助。

1 个答案:

答案 0 :(得分:3)

从您的问题来看,您似乎正在使用实体属性值模式。要使用AND过滤结果,您需要根据搜索条件多次将表连接到自身。这是与此模式相关的开销。以下是一个示例代码,它解决了在您的方案中如何处理联接的问题。在示例中,我假设将所有属性组合在一起的实体ID为“strFormId”。

Dictionary<string, string> equalitySearchCriteria = new Dictionary<string, string>();
equalitySearchCriteria.Add("TrainingProgram Code", ddlSearch.Text);
equalitySearchCriteria.Add("District",ddlDistrict.SelectedItem.Text);
// Add other items

Dictionary<string, string> likeSearchCriteria = new Dictionary<string, string>();
likeSearchCriteria.Add("Province", ddlProvince.SelectedItem.Text.ToLower());
// Add other items

var query = attributesData.Where(x => true);

foreach(var criterion in equalitySearchCriteria)
{
   var equalityJoinQuery = attributesData.Where(x => x.attributeName == criterion.Key && x.strValue == criterion.Key);
   query = query.Join(equalityJoinQuery, x => x.strFormId, y => y.strFormId, (x, y) => x);
}

foreach(var criterion in likeSearchCriteria)
{
   var likeJoinQuery = attributesData.Where(x => x.attributeName == criterion.Key && x.strValue.Contains(criterion.Key));
   query = query.Join(likeJoinQuery, x => x.strFormId, y => y.strFormId, (x, y) => x);
}

var result = query.Select(t => t.strFormId).Distinct().ToList();