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};