Левое соединение запрос профилей пользователей


У меня следующая левое соединение запрос LINQ, которая возвращает результаты, которые я ожидаю, но это не "чувствовать" право. Мне нужны все записи из профиля пользователя в таблице.

Тогда LastWinnerDate является одна запись из таблицы (возможны несколько записей) с указанием типа datetime последняя запись была внесена в таблицу для пользователей.

  • WinnerCount - это количество записей для пользователей в победитель таблице (возможны несколько записей).
  • Видео1 - в основном типа bool , указывающее, существует или нет Запись пользователя в победитель таблица соответствия третьей таблицы цель (должна быть 1 или 0 строк).
  • Quiz1 такой же, как Видео1 соответствующие очередную запись из объективных стол (должно быть 1 или 0 строк).
  • Видео и тест повторяется 12 раз, потому что они используются для отчета, которое будет отображаться пользователю список всех пользователей, записей и свидетельствуют о наличии у них достигнуты цели.

var objectiveIds = new List<int>();
objectiveIds.AddRange(GetObjectiveIds(objectiveName, false));

var q =
    from up in MetaData.UserProfile
    select new RankingDTO
    {
        UserId = up.UserID,
        FirstName = up.FirstName,
        LastName = up.LastName,
        LastWinnerDate = (
            from winner in MetaData.Winner
            where objectiveIds.Contains(winner.ObjectiveID)
            where winner.Active
            where winner.UserID == up.UserID
            orderby winner.CreatedOn descending
            select winner.CreatedOn).First(),
        WinnerCount = (
            from winner in MetaData.Winner
            where objectiveIds.Contains(winner.ObjectiveID)
            where winner.Active
            where winner.UserID == up.UserID
            orderby winner.CreatedOn descending
            select winner).Count(),
        Video1 = (
            from winner in MetaData.Winner
            join o in MetaData.Objective on winner.ObjectiveID equals o.ObjectiveID
            where o.ObjectiveNm == Constants.Promotions.SecVideo1
            where winner.Active
            where winner.UserID == up.UserID
            select winner).Count(),
        Quiz1 = (
            from winner2 in MetaData.Winner
            join o2 in MetaData.Objective on winner2.ObjectiveID equals o2.ObjectiveID
            where o2.ObjectiveNm == Constants.Promotions.SecQuiz1
            where winner2.Active
            where winner2.UserID == up.UserID
            select winner2).Count(),
    };


695
10
задан 24 марта 2011 в 02:03 Источник Поделиться
Комментарии
2 ответа

Это не правильно, ведь у вас есть большое количество повторяющегося кода.

Обратите внимание, как каждое свойство селектора, где заявление содержит

        where objectiveIds.Contains(winner.ObjectiveID)
where winner.Active
where winner.UserID == up.UserID

Это означает, что вы можете выполнить рефакторинг это где условие вступить в содержащем запрос.

Также можно указать порядок на пункте, когда вы используете только значения, чтобы получить Граф(). Это ничего не делает, но занимают место и время.

Я думаю, что этот запрос может быть связан с тем, что вы пытаетесь достичь:

        var rankingDtos = 
from user in MetaData.UserProfile
let userWinners = from winner in MetaData.Winner
let objectives = from objective in MetaData.Objective
where winner.ObjectiveID == objective.ObjectiveID
select objective
where winner.UserID == user.UserID && winner.Active
orderby winner.CreatedOn descending
select new
{
Winner = winner,
Objectives = objectives
}
select new RankingDTO
{
UserId = user.UserID,
FirstName = user.FirstName,
LastName = user.LastName,
LastWinnerDate = userWinners.First().Winner.CreatedOn,
WinnerCount = userWinners.Count(x => objectiveIds.Contains(x.Winner.ObjectiveID)),
Video1 = userWinners.Count(x => x.Objectives.Any(o => o.ObjectiveNm == Constants.Promotions.SecVideo1)),
Quiz1 = userWinners.Count(x => x.Objectives.Any(o => o.ObjectiveNm == Constants.Promotions.SecQuiz1))
};

6
ответ дан 1 апреля 2011 в 07:04 Источник Поделиться

Что LINQ-это этот? Лиц? Языке esql, LINQ к SQL? LINQ для объектов?

Если LINQ к SQL, то:

Попробуйте это и посмотреть, что в результате SQL-это то решение на основе SQL или профиль для SQL на БД?

    /// <summary>
/// From BReusable
/// </summary>
/// <param name="dc"></param>
/// <remarks>http://www.davidhayden.com/blog/dave/archive/2007/08/17/DataContextLogLoggingLINQToSQLOutputConsoleDebuggerOuputWindow.aspx</remarks>
public static void SendQueriesToConsole(this DataContext dc)
{
dc.Log = Console.Out;
}

1
ответ дан 31 марта 2011 в 12:03 Источник Поделиться