문제

제가 작업 중인 웹 애플리케이션의 일부는 관리자가 1...n명의 사용자에게 보내는 메시지를 표시하는 영역입니다.LINQ to SQL 클래스가 포함된 DataAccess 프로젝트와 UI인 웹 사이트 프로젝트가 있습니다.내 데이터베이스는 다음과 같습니다

사용자 -> MessageDetail <- 메시지 <- 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 문을 삽입하는 것은 나에게 적합하지 않습니다.

여전히 사용자 인터페이스에 쿼리를 코딩하고 있는 것 같지만 지금은 SQL 대신 LINQ입니다.그러나 L2S 클래스와 UI 사이에 또 ​​다른 계층을 구축하면 LINQ의 유연성이 일부 줄어들 것이라고 생각합니다.데이터를 가져오기 위해 작성하는 코드의 양을 줄이는 것이 요점이 아닌가요?

제가 보지 못한 중간 지점이 있습니까? 아니면 LINQ to SQL이 사용되는 방식을 제가 잘못 이해하고 있는 것인가요?조언을 주시면 감사하겠습니다.

도움이 되었습니까?

해결책

모든 LINQ 쿼리는 비즈니스 로직 클래스, ADO와 같은 이전 방법론에는 변화가 없습니다.

당신이 순수주의자 비즈니스 클래스의 메서드에서 항상 List(of T)를 반환해야 합니다. 실제로 데이터 컨텍스트는 비즈니스 클래스에만 표시되어야 합니다.그런 다음 사용자 인터페이스에서 목록을 조작할 수 있습니다.

당신이 바쁜, 를 사용하면 IQueryable 개체를 반환하고 사용자 인터페이스에서 일부 조작을 수행할 수 있습니다.

다른 팁

LINQ와 관계없이 프레젠테이션 코드와 데이터베이스 관련 코드를 혼합하는 것은 좋은 생각이 아니라고 생각합니다.LINQ 쿼리 위에 간단한 DB 추상화 계층을 만들겠습니다.내 생각에 LINQ는 단지 편리한 도구일 뿐이며 기존 응용 프로그램 디자인에 심각한 영향을 주지 않습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top