我正在处理的部分Web应用程序是一个区域,显示从管理到1 ... n个用户的消息。我有一个包含LINQ to SQL类的DataAccess项目,以及一个作为UI的网站项目。我的数据库如下所示:
用户 - > MessageDetail< - Message< - MessageCategory
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的方式?建议将不胜感激。
答案 0 :(得分:5)
所有LINQ查询都应该在业务逻辑类中,与ADO等旧方法无关。
如果您是纯粹主义者,您应该始终从业务类中的方法返回List(of T),事实上,datacontext只应对业务类可见。 然后,您可以在用户界面中操作列表。
如果您是实用主义者,则可以返回IQueryable对象并在用户界面中进行一些操作。
答案 1 :(得分:1)
无论LINQ如何,我认为将表示代码与数据库相关代码混合起来并不是一个好主意。我会在LINQ查询之上创建一个简单的DB抽象层。在我看来,LINQ只是一个方便的工具,对传统的应用程序设计没有严重的影响。