문제

태그 기반 ASP.NET 시스템을 작성하고 있습니다. 다음 DB 체계 사용 :

Topic <many-many> TagTopicMap <many-many> Tag

기본적으로 다음에서 찾은 3NF 접근법 (Toxi)입니다. http://www.pui.ch/phred/archives/2005/04/tags-database-schemas.html

다음은 내가 가진 코드 스 니펫입니다.

DataLoadOptions options = new DataLoadOptions();
        options.LoadWith<Topic>(t => t.TagTopicMaps);
        options.LoadWith<TagTopicMap>(tt => tt.Tag);
        var db = new lcDbDataContext();
        db.LoadOptions = options;
        db.Log = w;

        var x = from topic in db.Topics
                orderby topic.dateAdded descending
                select topic;

        ViewData["TopicList"] = x.Take(10);

이것을 실행할 때 결과는 괜찮지 만 11 개의 단일 SQL 쿼리가 나타납니다. 하나는 상위 10 개 주제 목록을 얻을 수 있습니다.

    SELECT TOP (10) [t0].[Id], [t0].[title], [t0].[dateAdded]
FROM [dbo].[Topics] AS [t0] ORDER BY [t0].[dateAdded] DESC
-- Context: SqlProvider(Sql2005) Model: AttributedMetaModel Build: 3.5.30729.1 

그리고 태그의 세부 사항을 개별적으로 얻기 위해 다른 사람들 중 10 명.

나는 두 가지로드와 함께 명세서를 켜고 끄려고했는데 다음과 같은 일이 발생했습니다.

loadwith<topic> : no difference for on or off.
loadwith<tagtopicmap>: 11 Queries when on, much more when off.

요컨대, 두 번째로드 옵션 만 예상대로 작동합니다. 첫 번째는 효과가 없습니다!

또한 resultset tolist ()를 만들려고 노력했습니다. 그러나 더 많은 문제가 발생합니다. 태그 세부 사항 부분의 경우, 해당 고유 한 항목 만 검색합니다. 모든 반복 태그 (동일한 태그가 여러 주제에 나타날 수 있음)는 쿼리에 의해 삭제됩니다.

마지막으로, 다음은 ASPX에서 데이터를 검색하기 위해 사용한 코드입니다. 결과 tolist ()를 만들 때 (ILIST)로 변경 (ILIST)로 변경합니다.

<% foreach (var t in (IQueryable)ViewData["TopicList"])
       {
           var topic = (Topic)t;

    %>
    <li>
        <%=topic.title %> || 
        <% foreach (var tt in (topic.TagTopicMaps))
           { %>
                <%=tt.Tag.Name%>, 
                <%} %>
    </li>
    <%
        }
    %>
도움이 되었습니까?

해결책

짧은 대답은 다음과 같습니다. LinqToSQL은 이와 같은 몇 가지 단점을 가지고 있으며 때로는 작업 계정을 사용해야합니다 ...

LINQ2SQL로드 옵션은 단순히 데이터베이스 테이블 사이에 내부 결합을 유발하므로 LINQ 명령문을 같은 것으로 다시 작성하여 유사한 동작을 강요 할 수 있습니다 (오타를 용서하십시오. VB 구문에서 LINQ를 작성하는 데 사용됩니다 ...) :

var x = from topic in db.Topics
        join topicMap in topic.TagTopicMaps
        orderby topic.dateAdded descending
        group topicMap by topicMap.topic into tags = Group;

이 구문은 끔찍하게 잘못되었을 수 있지만 기본 아이디어는 LINQ2SQL이 주제와 TagtopicMaps 사이의 결합을 평가 한 다음 그룹화 (또는 "그룹 조인", "Let"등을 사용하여 결과 세트.

다른 팁

DataContext 클래스에서 enabledDefferedLoad를 False로 설정하십시오.

귀하의 경우 문제는 복용입니다 (10). 여기 말의 입에서 나온 것입니다.

https://connect.microsoft.com/visualstudio/feedback/details/473333/linq-teql-loadoptions-when-using-take-in-the-query

제안 된 해결 방법은 Skip (0)을 추가하는 것입니다. 그것은 나를 위해 효과가 없었지만 Skip (1)은 효과가있었습니다. 적어도 내 문제가 어디에 있는지 알고 있습니다.

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