我正在处理的 Web 应用程序的一部分是一个显示从管理层到 1...n 个用户的消息的区域。我有一个包含 LINQ to SQL 类的 DataAccess 项目,以及一个作为 UI 的网站项目。我的数据库如下所示:
用户 -> 消息详细信息 <- 消息 <- 消息类别
MessageDetail 是一个连接表,它还包含一个 IsRead 标志。
消息列表按类别分组。我在页面上有两个嵌套的 ListView 控件——一个输出组名,而第二个嵌套在里面,绑定到 MessageDetails 并输出消息本身。在列出消息的页面的代码隐藏中,我有以下代码:
protected void MessageListDataSource_Selecting(object sender, LinqDataSourceSelectEventArgs e)
{
var db = new DataContext();
// parse the input strings from the web form
int categoryIDFilter;
DateTime dateFilter;
string catFilterString = MessagesCategoryFilter.SelectedValue;
string dateFilterString = MessagesDateFilter.SelectedValue;
// TryParse will return default values if parsing is unsuccessful (i.e. if "all" is selected"):
// DateTime.MinValue for dates, 0 for int
DateTime.TryParse(dateFilterString, out dateFilter);
Int32.TryParse(catFilterString, out categoryIDFilter);
bool showRead = MessagesReadFilter.Checked;
var messages =
from detail in db.MessageDetails
where detail.UserID == (int)Session["UserID"]
where detail.Message.IsPublished
where detail.Message.MessageCategoryID == categoryIDFilter || (categoryIDFilter == 0)
where dateFilter == detail.Message.PublishDate.Value.Date || (dateFilter == DateTime.MinValue)
// is unread, showRead filter is on, or message was marked read today
where detail.IsRead == false || showRead || detail.ReadDate.Value.Date == DateTime.Today
orderby detail.Message.PublishDate descending
group detail by detail.Message.MessageCategory into categories
orderby categories.Key.Name
select new
{
MessageCategory = categories.Key,
MessageDetails = categories.Select(d => d)
};
e.Result = messages;
}
这段代码有效,但是在 LinqDataSource 控件的代码隐藏中粘贴这样一个巨大的 LINQ 语句并不适合我。
似乎我仍在将查询编码到用户界面中,只是现在它是 LINQ 而不是 SQL。但是,我觉得在 L2S 类和 UI 之间构建另一个层会削弱 LINQ 的一些灵活性。减少您为获取数据而编写的代码量不是重点吗?
是否有一些我没有看到的中间立场,或者我只是误解了应该使用 LINQ to SQL 的方式?建议将不胜感激。