如何让Entity Framework为给定代码调用DB一次?

时间:2011-06-14 13:25:24

标签: c# entity-framework

我必须在PatientChartImage表中检查PatientChartImage的存在。如果图像存在,我将其分配给现有对象。我在EF 4.0中使用以下代码

IEnumerable<PatientChartImage> pcimages = from pcImage in context.PatientChartImages
                                        where pcImage.PatientImageID == id
                                        select pcImage;
if (pcimages.Any())
{
   pcimage = pcimages.First();                                        
   isNewImage = false;
}
else
{ 
   isNewImage = true; 
}

Sql Profiler显示2个调用

  1. 首先是pcimages.Any()
  2. 第二个是pcimages.First()
  3. 如何使此代码仅调用DB一次。

4 个答案:

答案 0 :(得分:2)

改为使用FirstOrDefault()

  

返回a的第一个元素   序列,或者是默认值   序列不包含任何元素。

PatientChartImage pcimage = (from pcImage in context.PatientChartImages
                                  where pcImage.PatientImageID == id
                                  select pcImage).FirstOrDefault();
isNewImage = pcimage!=null;

我个人会在这种情况下使用lambda语法:

PatientChartImage pcimage = context.PatientChartImages
                                   .Where( x => x.PatientImageID == id)
                                   .FirstOrDefault();

答案 1 :(得分:2)

做这样的事情怎么样:

pcimage = pcimages.FirstOrDefault();
isNewImage = pcimage != null;

如果没有可用图像或查询序列中的第一个图像,则调用first或default将返回null。这应该只会导致单个数据库命中。

答案 2 :(得分:1)

var pcimage = (from pcImage in context.PatientChartImages
                                        where pcImage.PatientImageID == id
                                        select pcImage).FirstOrDefault();

isNewImage = pcimage != null;

答案 3 :(得分:0)

调用pcimages.FirstOrDefault()然后在进行处理之前检查它是否为null。

类似这样的事情

pcimage = pcimages.FirstOrDefault();
if (pcimage != null) {    
   isNewImage = false;
} else {     
   isNewImage = true;  
}