Код Linq-2-Sql: это масштабируется? - PullRequest
0 голосов
/ 30 октября 2009

Я только начинаю использовать linq to sql. Я надеюсь, что кто-то может проверить, что linq-2-sql отложил выполнение до выполнения цикла foreach. В конце концов, кто-то может сказать мне, если этот код масштабируется Это простой метод get с несколькими параметрами поиска. Спасибо!

Код:

public static IList<Content> GetContent(int contentTypeID, int feedID, DateTime? date, string text)
        {
            List<Content> contentList = new List<Content>();
            using (DataContext db = new DataContext())
            {
                var contentTypes = db.ytv_ContentTypes.Where(p => contentTypeID == -1 || p.ContentTypeID == contentTypeID);
                var feeds = db.ytv_Feeds.Where(p => p.FeedID == -1 || p.FeedID == feedID);

                var targetFeeds = from f in feeds
                                  join c in contentTypes on f.ContentTypeID equals c.ContentTypeID
                                  select new { FeedID = f.FeedID, ContentType = f.ContentTypeID };

                var content = from t in targetFeeds
                              join c in db.ytv_Contents on t.FeedID equals c.FeedID
                              select new { Content = c, ContentTypeID = t.ContentType };

                if (String.IsNullOrEmpty(text))
                {
                    content = content.Where(p => p.Content.Name.Contains(text) || p.Content.Description.Contains(text));
                }

                if (date != null)
                {
                    DateTime dateTemp = Convert.ToDateTime(date);
                    content = content.Where(p => p.Content.StartDate <= dateTemp && p.Content.EndDate >= dateTemp);
                }

                //Execution has been defered to this point, correct?
                foreach (var c in content)
                {
                    Content item = new Content()
                    {
                        ContentID = c.Content.ContentID,
                        Name = c.Content.Name,
                        Description = c.Content.Description,
                        StartDate = c.Content.StartDate,
                        EndDate = c.Content.EndDate,
                        ContentTypeID = c.ContentTypeID,
                        FeedID = c.Content.FeedID,
                        PreviewHtml = c.Content.PreviewHTML,
                        SerializedCustomXMLProperties = c.Content.CustomProperties
                    };
                    contentList.Add(item);
                }
            }
            //TODO
            return contentList;
        }

1 Ответ

0 голосов
/ 01 ноября 2009

Зависит от того, что вы имеете в виду под «весами». На стороне БД этот код может вызвать проблемы, если вы имеете дело с большими таблицами; Оптимизатор SQL Server действительно плохо справляется с оператором «или» в предикатах предложения where и склонен возвращаться к просмотрам таблиц, если их несколько. Вместо этого я бы пошел на пару вызовов .Union, чтобы избежать вероятности того, что SQL вернется к просмотру таблиц только из-за ||.

Если вы сможете поделиться более подробной информацией о базовых таблицах и данных в них, вам будет проще дать более подробный ответ ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...