在搜索中使用LINQ查询空字段

4
我有一个带有十个字段的表格。我需要在LINQ中编写查询以进行搜索。 我的字段是:
FirstName(字符串),LastName(字符串),FatherName(字符串),NotationId(整数),DebtPrice(整数),BranchName(字符串),DebtId(整数),MeliCode(字符串)
我的问题是:当用户不填写某个字段时,该字段不应在查询搜索中使用。 谢谢。
集合是Legal.View_Dossiers。

这只有8个字段。我不明白 - 这是一个LINQ to SQL查询吗?还是LINQ到集合? - Aidan
3个回答

4
您可以使用以下代码:
var query = from d in datacontext.sample where   
                            (TBoxFName.Text=="" || d.FirstName.Contains(TBoxFName.Text.Trim()))
                            &&(TBoxLName.Text == "" || d.LastName.Contains(TBoxLName.Text.Trim()))
                            &&(TBoxFatherName.Text == "" || d.FatherName.Contains(TBoxFatherName.Text.Trim()))
                            && (TBoxPriceDebt.Text == "" || d.DebtPrice.ToString().Contains(TBoxPriceDebt.Text.Trim()))
                            && (CBoxBranch.Text == "" || d.BranchName.Contains(CBoxBranch.Text.Trim()))
                            &&(TBoxDebt.Text == "" || d.DebtId.Contains(TBoxDebt.Text.Trim()))
                            &&(TBoxMeliCode.Text == "" || d.MeliCode.Contains(TBoxMeliCode.Text.Trim()))
                                select d;

为什么你写 TBoxFName.Text=="" 呢???如果运行 d.FirstName.Contains(TBoxFName.Text.Trim()) ,而且 d.FirstName 有值,则返回 true。 - Saeed Amiri
因为如果 TBoxFName.Text=="",那么firstname字段不会在搜索查询中起作用。 - aya
你的方法并非适用于所有情况。当TBoxFName.Text==""为空时,d.FirstName.Contains(TBoxFName.Text.Trim())会返回true,如果d.FirstName不为null。但是,如果要进行空值检查,则应该使用:d.FirstName != null && d.FirstName.Contains(TBoxFName.Text.Trim())。实际上,在你目前的方式中,如果文本框具有值且输入字符串为d.FirstName为null,则会抛出异常。事实上,我确信你目前的方式对问题的提出者没有任何帮助。 - Saeed Amiri
2
在代码中,当用户没有填写TBoxFName时,TBoxFName.Text是""并且条件为真。因此,名字不会影响搜索结果。但是,如果用户填写了TBoxFName,则检查d.FirstName.Contains(TBoxFName.Text.Trim())并且名字会影响搜索结果。 - Mehrdad
使用代码,您可以填充foo“文本框”或不填充foo“文本框”,这意味着您可以在填写相应的“文本框”时搜索“FirstName”。 - aya
1
在一个简单的1值搜索中包含7个条件句是让你的本地友好DBA来处决你的好方法。只是这么说。 - Marc Gravell

2

我认为(不太清楚)你是指像这样的东西:

IQueryable<YourType> query = /* some basic query; maybe db.TheTable */

if(!string.IsNullOrEmpty(firstName))
    query = query.Where(row => row.FirstName == firstName);
if(!string.IsNullOrEmpty(lastName))
    query = query.Where(row => row.LastName == lastName);
if(!string.IsNullOrEmpty(fatherName))
    query = query.Where(row => row.FatherName == fatherName);
// etc

var matches = query.Take(50).ToList();

这个使用查询组合来发出最合适的底层查询;例如,如果这是LINQ-to-SQL并且提供了firstNamefatherName,那么你会得到类似以下的内容:

select top 50 {some columns} from [dbo].[TheTable] t
where t.FirstName = @p0 and t.FatherName = @p1

@p0@p1是保存值的参数。


坦克马克的问题是搜索查询中没有使用“if”。 - Mehrdad
@Mehrdad请重新表述,我无法理解那个评论。不过,请注意查询 没有任何if - 请查看我包含的TSQL代码示例。 - Marc Gravell
"@p0"和"@p1"这些设置参数在哪里? - Mehrdad
@Mehrdad,它们来自于“captured”变量值,这些值是从firstNamelastNamefatherName中获取的,我假设你在某个地方已经有了这些值(也许是从UI控件中)。LINQ-to-SQL和EF等会为您参数化这些值。 - Marc Gravell
你好 Marc, 如果 @p0 等于 Marc,你会找到所有 FirstName 等于该值的记录,当 @p0 等于 "" 时,你会找到所有 FirstName 等于 "" 的记录。 但是当使用 aya 的答案时, 如果 @p0 等于 "",则此字段不会影响查询搜索。 谢谢 Marc。 - aya
@aya,当p0的值为""时,这种情况永远不会出现,因为我们只在值非空(!string.IsNullOrEmpty(...))时才包含该过滤器。 - Marc Gravell

0

你可以尝试写:

IEnumerable<YourType> query = //data taken from database
var queryWhere = query 
    .Where(x => x.FirstName  == varFirstName   || string.IsNullOrEmpty(x.FirstName ))
    .Where(x => x.LastName == varLastName      || string.IsNullOrEmpty(x.LastName ))
    .Where(x => x.FatherName == varFatherName  || string.IsNullOrEmpty(x.FatherName ))
    //...and so on... 
    .ToList();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接