C# ut使用第一种方法,然后仅在存在效率问题的热点使用它 您可以让EF运行任意SQL,但避免它,除非这是一个很大的好处,因为太多这样的代码会降低使用linq方法的一致可读性(我不得不说,我认为Linq2SQL在调用存储过程方面胜过EF,在调用UDF方面更是如此,但即便如此,这一点仍然适用——仅从代码看事情之间的关系就不太清楚了)

C# ut使用第一种方法,然后仅在存在效率问题的热点使用它 您可以让EF运行任意SQL,但避免它,除非这是一个很大的好处,因为太多这样的代码会降低使用linq方法的一致可读性(我不得不说,我认为Linq2SQL在调用存储过程方面胜过EF,在调用UDF方面更是如此,但即便如此,这一点仍然适用——仅从代码看事情之间的关系就不太清楚了),c#,linq,entity-framework,entity-framework-4,C#,Linq,Entity Framework,Entity Framework 4,*顺便说一句,这个特定的优化没有应用,但是我们现在讨论的是最好的实现,所以不管它是,不是,或者只是在某些版本中 †不过我承认,Linq2SQL经常会产生使用APPLY的查询,我想不起来,因为在2005年引入SQLServer之前,我就习惯于考虑如何在SQLServer的版本中编写查询,而代码并没有那种人类习惯去遵循旧习惯的倾向。它几乎教会了我如何使用APPLY。如果这是一个大问题的话启用并在ID上建立索引,然后MAX(ID)应该标识该行,基于此ID的查询将获得该行。我不使用EF(4),但在LIN

*顺便说一句,这个特定的优化没有应用,但是我们现在讨论的是最好的实现,所以不管它是,不是,或者只是在某些版本中


†不过我承认,Linq2SQL经常会产生使用APPLY的查询,我想不起来,因为在2005年引入SQLServer之前,我就习惯于考虑如何在SQLServer的版本中编写查询,而代码并没有那种人类习惯去遵循旧习惯的倾向。它几乎教会了我如何使用APPLY。

如果这是一个大问题的话启用并在ID上建立索引,然后MAX(ID)应该标识该行,基于此ID的查询将获得该行。我不使用EF(4),但在LINQ2SQL中,我希望它生成一个“更聪明”的SQL查询(order by,如果存在索引,将使用带有限制子句的索引)..是否可以验证/发布生成的SQL以确保它确实是一种低效的方法?我所能验证的是,此调用所使用的方法会对不同的表进行另外两次调用,并且执行时会花费一些时间,因为这些表非常感谢。我将进一步深入了解EF4调用是如何对数据库执行的。我我对使用它还比较陌生,所以我有很多东西要学。我只是或多或少地想知道是否有更好的方法可以达到同样的效果。好吧,我对这个目标感到失望。稍后我会对答案做一些解释,但现在我要去睡觉了。嘿,非常感谢你花时间为我解释一下。我真的很感激。这绝对是g让我更好地理解。
var x = db.MyTable.OrderByDescending(d => d.ID).FirstOrDefault();
public static YourType FinalItem(IQueryable<YourType> source)
{
  return source.OrderByDesending(d => d.ID).FirstOrDefault();
}
IEnumerable<YourType> l = SomeCallThatGivesUsAList();
var x = FinalItem(db.MyTable);//same as your code.
var y = FinalItem(l);//item in list with highest id.
var z = FinalItem(db.MyTable.Where(d => d.ID % 10 == 0);//item with highest id that ends in zero.
public static YourType FinalItem(IEnumerable<YourType> source)
{
  YourType highest = default(YourType);
  int highestID = int.MinValue;
  foreach(YourType item in source)
  {
    curID = item.ID;
    if(highest == null || curID > highestID)
    {
      highest = item;
      highestID = curID;
    }
  }
  return highest;
}
SELECT * FROM MyTable
SELECT * FROM MyTable ORDER BY id DESC
SELECT TOP 1 * FROM MyTable ORDER BY id DESC
SELECT * FROM MyTable ORDER BY id DESC LIMIT 1
return dataReader.Read() ?
  new MyType{ID = dataReader.GetInt32(0), dataReader.GetInt32(1), dataReader.GetString(2)}//or similar
  : null;
public static int Count<T>(this IEnumerable<T> source)
{
  var asCollT = source as ICollection<T>;
  if(asCollT != null)
    return asCollT.Count;
  var asColl = source as ICollection;
  if(asColl != null)
    return asColl.Count;
  int tally = 0;
  foreach(T item in source)
    ++tally;
  return tally;
}
var result = from a in db.Table1
  join b in db.Table2
  on a.relatedBs = b.id
  select new {a.id, b.name};