Заполните свойства навигации при использовании в методе, переданном предложению Where

Все эти ответы очень приятные.

Мое решение использует фрагменты кода для выполнения задания.

Это использует простейший вызов события PropertyChanged.

Сохраните этот фрагмент и используйте его, когда вы используете фрагмент «fullprop».

Местоположение можно найти в меню «Инструменты \ Код Snippet Manager ...» в Visual Studio.

<?xml version="1.0" encoding="utf-8" ?>
<CodeSnippets  xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet">
    <CodeSnippet Format="1.0.0">
        <Header>
            <Title>inotifypropfull</Title>
            <Shortcut>inotifypropfull</Shortcut>
            <HelpUrl>http://ofirzeitoun.wordpress.com/</HelpUrl>
            <Description>Code snippet for property and backing field with notification</Description>
            <Author>Ofir Zeitoun</Author>
            <SnippetTypes>
                <SnippetType>Expansion</SnippetType>
            </SnippetTypes>
        </Header>
        <Snippet>
            <Declarations>
                <Literal>
                    <ID>type</ID>
                    <ToolTip>Property type</ToolTip>
                    <Default>int</Default>
                </Literal>
                <Literal>
                    <ID>property</ID>
                    <ToolTip>Property name</ToolTip>
                    <Default>MyProperty</Default>
                </Literal>
                <Literal>
                    <ID>field</ID>
                    <ToolTip>The variable backing this property</ToolTip>
                    <Default>myVar</Default>
                </Literal>
            </Declarations>
            <Code Language="csharp">
                <![CDATA[private $type$ $field$;

    public $type$ $property$
    {
        get { return $field$;}
        set { 
            $field$ = value;
            var temp = PropertyChanged;
            if (temp != null)
            {
                temp(this, new PropertyChangedEventArgs("$property$"));
            }
        }
    }
    $end$]]>
            </Code>
        </Snippet>
    </CodeSnippet>
</CodeSnippets>

Вы можете изменить вызов по своему усмотрению (использовать вышеупомянутые решения)

0
задан Iliyan Ivanov 7 March 2019 в 15:49
поделиться

1 ответ

Проблема в том, что вы материализуете запрос, используя свой метод FilterBySearchTerm. EF не может преобразовать случайные методы в SQL, поэтому он должен пойти дальше и выполнить запрос, получить результаты обратно, а затем применить ваш Where. EF фактически выкинул бы исключение в прошлом, но EF Core обрабатывает это молча.

В любом случае, как только запрос будет выполнен, все готово. Ваша фильтрация происходит в памяти, и в этот момент без Include ваши связанные сущности не будут там работать. Короче говоря, вам нужно будет создать свой фильтр на месте (а не использовать отдельный метод), чтобы EF смог преобразовать его в SQL.

Альтернативный подход, который может помочь вам лучше, - передать запрос в ваш метод FilterBySearchTerm. Например, вместо того, чтобы делать:

query = query.Where(c => FilterBySearchTerm(c, searchTerm));

Делать

query = FilterBySearchTerm(query, searchTerm);

Затем внутри FilterBySearchTerm вы можете напрямую применять предложения Where к переданному в запросе. Это позволяет вам создавать фактический запрос, который EF может понять, и в то же время инкапсулировать логику.

0
ответ дан Chris Pratt 7 March 2019 в 15:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: