Все эти ответы очень приятные.
Мое решение использует фрагменты кода для выполнения задания.
Это использует простейший вызов события PropertyChanged.
Сохраните этот фрагмент и используйте его, когда вы используете фрагмент «fullprop».
Местоположение можно найти в меню «Инструменты \ Код Snippet Manager ...» в Visual Studio.
blockquote><?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>
Вы можете изменить вызов по своему усмотрению (использовать вышеупомянутые решения)
Проблема в том, что вы материализуете запрос, используя свой метод 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 может понять, и в то же время инкапсулировать логику.