LINQ Выберите вопрос запроса - PullRequest
0 голосов
/ 15 декабря 2009

У меня есть следующие объекты:

CartoonStory

CartoonFigure

Пол

A CartoonStory сообщается одним или несколькими CartoonFigure s, а CartoonFigure имеет Пол мужчины или женщины.

Когда пользователь моего сайта, например, женщина, я хочу получить CartoonFigures только с женщиной пола, если таковые имеются. Если это не так, вместо этого получите MaleFigFigures.

Итак, я получаю CartoonStory, проверьте, есть ли под ним женские карикатуры, если нет, вместо этого укажите мужские карикатуры.

Как я могу сделать это в LINQ. Особенно роль принимают женщины, если они существуют, если не мужчины.

Заранее спасибо!

Мартейн

Ответы [ 3 ]

2 голосов
/ 15 декабря 2009

Не зная каких-либо подробностей о ваших классах, что-то вроде этого должно работать:

private static IEnumerable<CartoonFigure> GetFigures(CartoonStory story, Sex preferredSex)
{
    var result = story.StoryTellerFigures.Where(cf => cf.Sex == preferredSex);
    if (!result.Any())
    {
        result = story.StoryTellerFigures;
    }
    return result;
}

Другими словами; отфильтруйте фигуры рассказчика с предпочтительным полом из истории. Если ничего не найдено, просто верните все персонажи рассказчика из истории (они будут противоположного пола).

1 голос
/ 15 декабря 2009

Достаточно просто. Через этот код в частичном для вашей CartoonStory модели.

partial class CartoonStory
{
    public IEnumerable<CartoonFigure> FemalesThenMales
    {
        get
        {
            return Females.Count() > 0 ? Females : Males;
        }
    }
    public IEnumerable<CartoonFigure> Females
    {
        get
        {
            return CartoonFigures.Where(c => c.Sex.Name == "Female");
        }
    }
    public IEnumerable<CartoonFigure> Males
    {
        get
        {
            return CartoonFigures.Where(c => c.Sex.Name == "Male");
        }
    }


}

РЕДАКТИРОВАТЬ (после вопроса автора комментария):

Когда вы будете готовы искать персонажей мультфильма.

var figures = dataContext.CartoonStories.Where(c => c.Id == 1).FemalesThenMales; 

Очень ясно, что происходит. Я большой поклонник разбиения кода на более мелкие, легко узнаваемые части. Да, это будет отправлено в базу данных в виде одного или двух запросов (один, если женщины найдены; два в противном случае).

НЕ ДЕЛАЙТЕ ЭТОГО !!!

var figures = dataContext.CartoonStories.Where(c => c.Id == 1).CartoonFigures.Any(c => c.Sex == "Female") ? dataContext.CartoonStories.Where(c => c.Id == 1).CartoonFigures.Where(c => c.Sex == "Female") : dataContext.CartoonStories.Where(c => c.Id == 1).CartoonFigures.Where(c => c.Sex == "Male");

Одни лайнеры - это не все, чем они хотят. (

0 голосов
/ 15 декабря 2009

IEnumerable Cfig = CartoonFigure.OrderBy (W => (W.Sex == "Female")? 1: 100);

Если сначала будут заказывать женщины, а потом мужчины ... Так что, если есть женщины, вы получите их в первую очередь.

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