Оставил ли Joins в LINQ с несколькими критериями? - PullRequest
0 голосов
/ 28 сентября 2011

Как вы добавляете дополнительные критерии к своим левым соединениям? В LINQ вы можете иметь только одно условие соединения "x.id равно y.id". С внутренними объединениями это не проблема, просто добавьте их в предложение where. Когда вы делаете левое соединение, это создает проблемы в LINQ. Добавление этого дополнительного критерия, кажется, заставляет его быть внутренним соединением.

join s in db.tblCustomerPricingSchemes on c.CustomerID equals s.CustomerID into g1
from s in g1.DefaultIfEmpty()
join p in db.tblPricingSchemes on l.LangPairs equals p.PSLangPairID into g2
from p in g2.DefaultIfEmpty()
where t.JobID == jobID
    //&& s.PSLangPairID == l.LangPairs
    //&& p.PSDescID == c.PricingID

Есть идеи?

Спасибо, Стив

Ответы [ 3 ]

1 голос
/ 28 сентября 2011

попробуй

from c in db.tblCustomer
from s in db.tblCustomerPricingSchemes.Where(w => w.CustomerID == c.CustomerID).DefaultIfEmpty()
from p in db.tblPricingSchemes.Where(w => w.PSLangPairID == l.LangPairs).DefaultIfEmpty()
where t.JobID == jobID
select c // etc
1 голос
/ 28 сентября 2011
from s in db.tblCustomerPricingSchemes
   .where(x => c.CustomerID == x.CustomerID && 
          x.PSLangPairID == l.LangPairs).DefaultIfEmpty()
0 голосов
/ 28 сентября 2011

У вас есть два варианта.

Во-первых, используйте навигационные свойства. Я спросил , почему люди используют соединения вместо свойств навигации некоторое время назад, и ответы подтвердили мое понимание - реальная причина редко бывает, и обычно это ошибка. Как предлагают другие ответы здесь, используйте некоторые предложения where для фильтрации графа вашего объекта.

db.tblCustomerPricingSchemes.Where(x => condition).Select(scheme => 
    new { scheme, scheme.LangPair, scheme.LangPair.PricingScheme });

Однако, если вам нужно присоединиться, попробуйте разрешить внешнее объединение в предложении where, выполнив несколько нулевых проверок.

where t.JobID == jobID
    && (s.PSLangPairID == null 
        || l.LangPairs == null 
        || s.PSLangPairID == l.LangPairs)
    && (p.PSDescID == null 
        || c.PricingID == null
        || p.PSDescID == c.PricingID)

если бы это был SQL, вы используете оператор объединения, но не уверены, что это сработает, и снова зависит от того, используете ли вы LINQ-to-SQL или Entity Framework.

&& (s.PSLangPairID ?? l.LangPairs) == l.LangPairs
&& (p.PSDescID ?? c.PricingID) == c.PricingID
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...