[英]Implementing dynamic query using linq functions
我正在尝试实现一个代码块,该代码块可以向linq查询动态添加where子句。 这完全可以帮助我在搜索过程中仅考虑全文本框并跳过空控件。现在的问题是,尽管我在Linq查询中添加了所有条件, 但它会返回所有行并忽略where子句。
原因是什么?如何避免此问题?
在这里,我有一个简单的抽象BaseEntity类,该类仅包含一个称为Id的字段:
public abstract class BaseEntity
{
public virtual int Id { get; set; }
}
我的EmailEntity类是从此BaseEntity继承的:
public class EmailEntity : BaseEntity
{
public string Address { get; set; }
public string Pwd { get; set; }
public string Hint { get; set; }
public EmailGroup? EmailGroup { get; set; }
}
这是我创建查询的地方:
private void BtnSearch_Click(object sender, RoutedEventArgs e)
{
var mails = new List<EmailEntity>();
using (var op = new OperationContext())
{
var query = op.EmailEntities;
if (!string.IsNullOrEmpty(SearchEmailTxt.Text))
query.Where(item => item.Address == SearchEmailTxt.Text);
if (!string.IsNullOrEmpty(SearchEmailIdTxt.Text))
query.Where(item => item.Id == Convert.ToInt16(SearchEmailIdTxt.Text));
if (SearchEmailGroupCombo.SelectedItem != null)
query.Where(item => item.EmailGroup.ToString() == SearchEmailGroupCombo.SelectedItem.ToString());
var result=query.ToList();
result.ForEach(mails.Add);
EmailDataGrid.ItemsSource = mails;
}
}
因为query.Where
返回了查询,所以您忽略了结果,这使您开始工作。 您应该更改代码,例如query = query.Where(....);
private void BtnSearch_Click(object sender, RoutedEventArgs e)
{
var mails = new List<EmailEntity>();
using (var op = new OperationContext())
{
IQueryable<EmailEntity> query = op.EmailEntities;
if (!string.IsNullOrEmpty(SearchEmailTxt.Text))
query = query.Where(item => item.Address == SearchEmailTxt.Text);
if (!string.IsNullOrEmpty(SearchEmailIdTxt.Text))
query = query.Where(item => item.Id == Convert.ToInt16(SearchEmailIdTxt.Text));
if (SearchEmailGroupCombo.SelectedItem != null)
query = query.Where(item => item.EmailGroup.ToString() == SearchEmailGroupCombo.SelectedItem.ToString());
var result=query.ToList();
result.ForEach(mails.Add);
EmailDataGrid.ItemsSource = mails;
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.