我如何最好地结合这两个LINQ表达式?

时间:2011-04-06 15:56:25

标签: c# linq .net-4.0

第一个表达式使用另一个标识值检索联系人的ID。第二个表达式使用联系人ID检索整个联系人。看起来我应该能够将这两个陈述合并为一个,但我挣得太多(疲惫,压力,愚蠢的错误等等)。这两个陈述起作用,我得到了我需要的结果,但我觉得它可能更清晰,可能只是一个表达式。

感谢大家的帮助!

var contactId = DAL.dc.ContactMrns.Where(cm => cm.MRN == recipient.MRN)
.Select(x => x.ContactId)
.First();

var contact = DAL.dc.Contacts.Where(c => c.ContactID == contactId).First();

4 个答案:

答案 0 :(得分:5)

嗯,看起来这可能是一个加入:

var contact = (from cm in DAL.dc.ContactMrns
               where cm.MRN == recipient.MRN
               join c in DAL.dc.Contacts on c.ContactID equals cm.ContactID
               select c).First();

请注意,您可能希望使用Single()代替First()来明确表示您确实只期望单个结果。

另一种选择是使用Single overload which takes an expression

var contact = DAL.dc.Contacts.Single
   (c => c.ContactID == DAL.dc.ContactMrns.Single
         (cm => cm.MRN == recipient.MRN).ContactID);

答案 1 :(得分:0)

你可以这样做:

var contact = DAL.dc.Contacts.First(
    c => c.ContactID == DAL.dc.ContactMrns.First(
        cm => cm.MRN == recipient.MRN));

答案 2 :(得分:0)

直接使用第二个表达式。通过它,你有Contact对象,并通过它直接联系和contactId

答案 3 :(得分:0)

当然,你可以,这只是一个问题,它是否有用。

var contact = DAL.dc.Contacts.First(contact => 
       contact.ContactId == DAL.dc.ContactMrns.First(mrns =>
             mrns.MRN == recipient.MRN))