【发布时间】:2013-12-10 05:56:06
【问题描述】:
我已经搜索了很多帖子,但仍然无法达到我想要的结果。
我有一个带有 3 个组合框和一个搜索按钮的 aspx 页面。 当用户单击搜索按钮时,我想构建一个 linq 查询,该查询仅返回组合框中选择的过滤器的结果并将其绑定到 gridview。
组合框是帐户、站点和交易,我正在搜索日志并且只想返回所选组合框的
点击按钮
protected void btnSearch_Click(object sender, EventArgs e)
{
// This is the Linq definition
List<Expression<Func<Logs, bool>>> predicates = new List<Expression<Func<Logs, bool>>>();
if (Convert.ToInt32(cboAccount.SelectedValue) != -1)
{
var accountID = Convert.ToInt32(cboAccount.SelectedValue);
predicates.Add(p => p.accountID == accountID);
}
if (Convert.ToInt32(cboSite.SelectedValue) != -1)
{
var siteID = Convert.ToInt32(cboSite.SelectedValue);
predicates.Add(p => p.siteID == siteID);
}
if (Convert.ToInt32(cboTransactionType.SelectedValue) != -1)
{
var transID = Convert.ToInt32(cboTransactionType.SelectedValue);
predicates.Add(p => p.transactionID == transID);
}
rgLog.DataSource = Logs.LoadLogs(predicates);
}
我的日志类中的方法
public class Logs
{
private int AccountID;
private int SiteID;
private string SerialNumber;
private int UserID;
private int TransActionMessageID;
public int accountID
{
get { return AccountID; }
set { AccountID = value; }
}
public int siteID
{
get { return SiteID; }
set { SiteID = value; }
}
public string serialNumber
{
get { return SerialNumber; }
set { SerialNumber = value; }
}
public int userID
{
get { return UserID; }
set { UserID = value; }
}
public int transactionMessageID
{
get { return TransActionMessageID; }
set { UserID = value; }
}
public static IQueryable<TransactionLog> LoadLogs(List<Expression<Func<TransactionLog, bool>>> predicates)
{
iThNkContextDataContext db = new iThNkContextDataContext();
var LogList = db.TransactionLogs.AsQueryable();
foreach (Expression<Func<TransactionLog, bool>> pred in predicates)
{
LogList = LogList.Where(pred);
}
List<TransactionLog> result = LogList.ToList();
return result;
}
我不知道我做错了什么 提前谢谢你。
【问题讨论】:
-
那么您提供的代码会发生什么?还有你为什么打电话给
AsQueryable(),而db.TransactionLogs应该已经兼容IQueryable<T>了? -
添加 .AsQueryable() 的原因是我可以使用表达式树,标准查询是 IEnumerable 而不是 IQueryable。
-
真的不应该。如果是,则意味着您的所有过滤都将在客户端执行。如果您使用的是
DataContext,我希望您使用Table<TransactionLog>。 -
那么我该如何正确地写这个?
-
你还没有告诉我们出了什么问题 - 但你真的应该看看你的
iThNkContextDataContext.TransactionLogs属性返回什么。
标签: c# sql linq iqueryable predicate