EntitySet Querying
Я пытаюсь выполнить запрос, похожий на
var results = MyItem.MyEntitySet.Where( x => x.PropertyB == 0 )
MyEntitySet имеет одну связь, PropertyA, с MyItem.
В идеале базовый SQL-запрос должен быть
SELECT .. FROM .. WHERE ([t0].[PropertyA] = @p0) AND ([t0].[PropertyB ] = @p1)
поскольку PropertyA и PropertyB являются двумя первичными ключами таблицы, к которой я обращаюсь.
Но мои следы, кажется, указывают, что программа запрашивает PropertyA первым, чтобы вернуть MyEntitySet
затем запрашивает PropertyB для возврата var results
,
Можно ли в любом случае заставить Linq выполнить запрос с этими двумя условиями в одном операторе SQL?
1 ответ
Может быть, а может и нет. Сгенерированный SQL соответствует тому, как вы пишете запрос LINQ, поэтому сгенерированный SQL не является неожиданностью. Если вы начали с сущности, представленной "MyEntitySet", то, возможно, сгенерированный SQL изменится.
Не сразу понятно, используете ли вы LINQ to SQL или Entity Framework. LINQ to SQL действительно представляет отношения "один ко многим" как "набор сущностей", в то время как Entity Framework обрабатывает отношения как объекты первого класса, так что отношение "один ко многим" представляет собой набор объектов отношений со связанными объектами, а не просто набор сущностей. Это влияет на сгенерированный SQL.
Две другие мысли...
Если вы хотите так много контролировать сгенерированный SQL, вы, вероятно, не будете довольны LINQ. Он не всегда генерирует оптимальный SQL (хотя иногда может вас удивить). С другой стороны, одним из основных преимуществ LINQ является то, что вы начинаете писать код, который выражает реальные отношения в ваших данных. Недостатком классического ADO.NET является то, что вы пишете код для манипулирования SQL и обработки коллекций DataSet и DataTable. LINQ - это бесконечно чище, безопаснее, надежнее и удобнее в написании кода. Все это компромисс.
Во-вторых, генерация запросов, вероятно, со временем станет лучше (особенно в Entity Framework).