2011-08-19 48 views
0

我正在实施一个搜索,将采取六个可能的(但不是必需的)用户输入,然后尝试将它们匹配到一些实体。Linq到实体搜索算法

我认为我遇到的问题是EF和SQL Server认为空值是两个完全不同的东西。

想法:选择一个实体,其中columnA =(如果columnA为null,则columnA(或null)else searchTerm)。搜索条件是整数和字符串的混合。

一些代码:

entities= (from c in context.Entities 
      where c.ColumnA == (searchTermA ?? v.ColumnA) 
      where c.ColumnB == (searchTermB ?? v.ColumnB) 
      select new 
      { 
       v.Property, 
      }).ToList(); 

如果所有列不包含空值,实体返回。但是,如果列中有空值,我不会得到预期的结果。

我该如何解决这个问题?

理查德

+0

哪里了'v'从何而来?它应该是'c'吗? –

+0

是的,都是一样的.. e's,v's,c's ...他们无处不在.. – Richard

回答

0

这是我用来处理空值。这是我能得到正确结果的唯一方法。

((searchTermA.HasValue) ? (c.ColumnA == searchTermA) : true) 
+0

我会接受这个,因为它非常接近我后来将我的头撞在厨房桌子上的可能解决方案。我试过: searchTermA == null? true:v.ColumnA == searchTermA 我会研究哪种组合最适合今天。谢谢! – Richard

0

简单的方法是这样:

var query = from c in context.Entities; 

if (searchTermA != null) { 
    query = query.Where(c => c.ColumnA == searchTermA); 
} 

// Rest of your conditions defined in the same way. 

var entities = query.Select(c => new { c.Property }).ToList();