只是好奇Skip&Take应该如何工作.我得到了我想在客户端看到的结果,但是当我连接AnjLab SQL Profiler并查看正在执行的SQL时,它看起来好像在查询并将整个行集返回到客户.
是否真的返回所有行,然后在客户端使用LINQ对事物进行排序和缩小?
我尝试过使用Entity Framework和Linq to SQL; 两者似乎都有相同的行为.
不确定它有什么不同,但我在VWD 2010中使用C#.
任何见解?
public IEnumerable<Store> ListStores(Func<Store, string> sort, bool desc, int page, int pageSize, out int totalRecords)
{
var context = new TectonicEntities();
totalRecords = context.Stores.Count();
int skipRows = (page - 1) * pageSize;
if (desc)
return context.Stores.OrderByDescending(sort).Skip(skipRows).Take(pageSize).ToList();
return context.Stores.OrderBy(sort).Skip(skipRows).Take(pageSize).ToList();
}
Run Code Online (Sandbox Code Playgroud)
结果SQL(注意:我排除了Count查询):
SELECT
[Extent1].[ID] AS [ID],
[Extent1].[Name] AS [Name],
[Extent1].[LegalName] AS [LegalName],
[Extent1].[YearEstablished] AS [YearEstablished],
[Extent1].[DiskPath] AS [DiskPath],
[Extent1].[URL] AS [URL],
[Extent1].[SecureURL] AS [SecureURL],
[Extent1].[UseSSL] AS [UseSSL]
FROM [dbo].[tec_Stores] AS [Extent1] …Run Code Online (Sandbox Code Playgroud) 我想为那些想要从linq2sql迁移到linq2entities和ADO.net Entity Framework(在这里称为L2E)的人们开始参考.我不想讨论哪两个更好.我只是想为那些想要从一个过渡到另一个的人创建这两者之间的差异列表.
基本的东西很简单:删除linq2sql数据类,添加ado.net模型(从数据库创建).将"实体"重命名为以前的datacontext名称.
using (MyDataClassesDataContext mydc = new MyDataClassesDataContext())
{
// change data
mydc.SubmitChanges();
}
Run Code Online (Sandbox Code Playgroud)
在L2E中,这必须改为:
using (MyDataClassesDataContext mydc = new MyDataClassesDataContext())
{
// change data
mydc.SaveChanges();
}
Run Code Online (Sandbox Code Playgroud)
using (MyDataClassesDataContext mydc = new MyDataClassesDataContext())
{
MyTable myRow = new MyTable();
mydc.MyTable.InsertOnSubmit(myRow);
mydc.SubmitChanges();
}
Run Code Online (Sandbox Code Playgroud)
在L2E中,这必须改为:
using (MyDataClassesDataContext mydc = new MyDataClassesDataContext())
{
MyTable myRow = new MyTable(); // or = MyTable.CreateMyTable(...);
mydc.AddToMyTable(myRow);
mydc.SaveChanges();
}
Run Code Online (Sandbox Code Playgroud)
mydc.MyTable.Attach(myRow);
Run Code Online (Sandbox Code Playgroud)
在L2E中:
// you …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用LINQ to SQL从表中选择一些特定的列,并将结果作为强类型的对象列表返回.
例如:
var result = (from a in DataContext.Persons
where a.Age > 18
select new Person
{
Name = a.Name,
Age = a.Age
}
).ToList();
Run Code Online (Sandbox Code Playgroud)
任何帮助将不胜感激.
它构建良好,但是当我运行它时,我得到了错误.MyEntity不允许在查询中显式构造实体类型.
使用Dynamic LINQ库(链接),是否容易受到注入?和(如果是的话)如何防止这种情况?
安全注意事项(实体框架)的一些背景知识:
LINQ to Entities注入攻击:
尽管在LINQ to Entities中可以进行查询组合,但它是通过对象模型API执行的.与实体SQL查询不同,LINQ to Entities查询不是使用字符串操作或连接组成的,并且它们不易受传统SQL注入攻击的影响.
由于动态SQL是使用字符串组成的,这意味着它可能容易受到注入向量的影响吗?或者LINQ to SQL会根据Dynamic LINQ库中的基础数据类型自动处理参数化值吗?
或者它是完全安全的,因为动态查询将在内存中执行而不是在SQL上执行(从而否定SQL索引的任何好处)?
我一直在努力理解DynamicLibrary.cs代码,但我确信我可以很容易地忽略一些东西.
由于这个问题是关于动态LINQ库本身,这个问题可以被认为适用于两者linq-to-sql和linq-to-entities(尽管上面引用了实体框架).
我有一个Category实体,它有一个Nullable ParentId字段.当下面的方法正在执行且categoryId为null时,结果似乎为null,但是有些类具有null ParentId值.
这里有什么问题,我错过了什么?
public IEnumerable<ICategory> GetSubCategories(long? categoryId)
{
var subCategories = this.Repository.Categories.Where(c => c.ParentId == categoryId)
.ToList().Cast<ICategory>();
return subCategories;
}
Run Code Online (Sandbox Code Playgroud)
顺便说一句,当我将条件更改为(c.ParentId == null)时,结果似乎正常.
向大多数列表添加项目有3种方法...
Add(SomeType)IList<T>.Add(T)接口IList.Add(object)接口方法你通常期望他们的行为或多或少相同.然而,LINQ EntitySet<T>是......在3.5和4.0上都很奇怪; 该IListAPI 不会标志设定为"分配" -其他两种机制做 -这听起来微不足道,但它是因为它极大地影响系列化重要(即导致其跳过)的样板代码.
例:
EntitySet<string> set1 = new EntitySet<string>();
set1.Add("abc");
Debug.Assert(set1.Count == 1); // pass
Debug.Assert(set1.HasLoadedOrAssignedValues, "direct"); // pass
EntitySet<string> set2 = new EntitySet<string>();
IList<string> typedList = set2;
typedList.Add("abc");
Debug.Assert(set2.Count == 1); // pass
Debug.Assert(set2.HasLoadedOrAssignedValues, "typed list"); // pass
EntitySet<string> set3 = new EntitySet<string>();
IList untypedList = set3;
untypedList.Add("abc");
Debug.Assert(set3.Count == 1); // pass
Debug.Assert(set3.HasLoadedOrAssignedValues, "untyped list"); // FAIL
Run Code Online (Sandbox Code Playgroud)
现在......这让我感到非常惊讶; 以至于我花了2个多小时跟踪代码以隔离发生的事情.所以... …
我试图获取列表中的第一个值和最后一个值.查询经营者First()的支持,但Last()并LastOrDefault()给出错误.我是否Last()以错误的方式使用操作员?
var purchaseBills = db.PurchaseBills.OrderBy(p => p.BillID);
if (purchaseBills.Count() >0)
{
var firstBill= purchaseBills.First(); //This is supported
//Attempt 1
var lastBill = purchaseBills.Last(); // Not supported
//Attempt 2
var lastBill = purchaseBills.LastOrDefault(); //Not supported
//Attempt 3
var lastBill = purchaseBills.Reverse().First(); //Not supported
textBoxPurchaseBillFrom.Text = firstBill.BillNo.ToString();
textBoxPurchaseBillTo.Text = lastBill.BillNo.ToString();
}
Run Code Online (Sandbox Code Playgroud)
更新: - 错误 -
尝试1:不支持查询运算符"Last".
尝试2:不支持查询运算符"LastOrDefault".
尝试3:不支持查询运算符"反向".
是否可以在LINQ查询中使用If Else条件?
就像是
from p in db.products
if p.price>0
select new
{
Owner=from q in db.Users
select q.Name
}
else
select new
{
Owner = from r in db.ExternalUsers
select r.Name
}
Run Code Online (Sandbox Code Playgroud) 我有一个非常简单的SQL查询
SELECT r.SpaceID, Count (*), SpaceCode
FROM Rider r JOIN Spaces s
ON r.SpaceID = s.SpaceID
GROUP BY r.SpaceID, s.SpaceCode
Run Code Online (Sandbox Code Playgroud)
请注意我的group by子句在多个表上,我想在linq中做同样的事情,我知道如何对单个表进行分组,但是关于多个表我不知道.
我有一个查询,我byte[]作为参数传递.我试图从中获取SQL查询并在管理工作室中运行该查询以进行调试.如何从中提取SQL语句?
committeeMember =
db.Committee_Member.FirstOrDefault(x => x.Customer_Number == activity.Contact.Number
&& x.Position_Start_Date.Value.Year == activity.EndDate
&& x.Committee_Id == activity.Committee.Id && x.Cancelled != 1);
Run Code Online (Sandbox Code Playgroud) linq-to-sql ×10
c# ×8
.net ×5
linq ×5
asp.net ×1
dynamic-linq ×1
entityset ×1
nullable ×1
sql ×1