Pro*_*ofK 12 .net linq asp.net
我在将telerik RadGrid和普通的ASP.NET GridView绑定到以下LINQ to实体查询的结果时遇到问题.在这两种情况下,网格都包含正确的行数,但只有少数几行的数据在所有其他行中都是重复的.我直接从此代码中为网格上的DataSource属性分配返回值.
public IEnumerable<DirectoryPersonEntry> FindPersons(string searchTerm)
{
DirectoryEntities dents = new DirectoryEntities();
return from dp in dents.DirectoryPersonEntrySet
where dp.LastName.StartsWith(searchTerm) || dp.Extension.StartsWith(searchTerm)
orderby dp.LastName, dp.Extension
select dp;
}
Run Code Online (Sandbox Code Playgroud)
ADDED:这是可行的替代普通ADO.NET代码:
DataTable ret = new DataTable();
using (SqlConnection sqn = new SqlConnection(ConfigurationManager.ConnectionStrings["WaveAdo"].ConnectionString))
{
SqlDataAdapter adap = new SqlDataAdapter("select * from DirectoryPersonList where LastName like '" + searchTerm + "%' order by LastName ", sqn);
sqn.Open();
adap.Fill(ret);
}
return ret;
Run Code Online (Sandbox Code Playgroud)
更多:
更新:基于下面Marc Gravel非常合乎逻辑且合适的建议,我发现EF设计师对我的实体类的实体键做了一个非常没有受过教育的猜测,这是其字段列表中的第一个字段,Department,所有其他记录中只共有七个条目.
这确实是重复的原因.如果只有我可以更改或删除实体键,但这个EF设计师具有Etch-a-Sketch的所有业务逻辑,令人钦佩地致力于重复它的延迟选择,同时嘲笑我锁在外面乞求改变密钥.
Mar*_*ell 30
它看起来像你有一个borked主键.LINQ-to-SQL和EF的"身份管理"方面意味着只要它看到相同对象类型的相同主键值,就必须返回相同的实例.
例如,给定数据:
id | name | ...
-------+------------+------
1 | Fred | ...
2 | Barney | ...
1 | Wilma | ...
1 | Betty | ...
Run Code Online (Sandbox Code Playgroud)
然后如果它id
在从LINQ迭代对象时认为是主键,则它被迫给你"Fred","Barney","Fred","Fred".本质上,当它id
再次看到1时,它甚至不会查看其他列 - 它只是id
从身份缓存中获取1 实例- 并为您提供之前给出的相同Fred实例.如果它不认为id
是主键,它会将每一行视为一个单独的对象(如果它在其中一个字段中具有与另一个记录相同的值,那么该怎么办 - 这并非完全不寻常).
我建议检查您标记为主键的任何字段(在DBML/EDM模型中)确实每行都是唯一的.在上面的情况中,该id
列显然不代表唯一标识符,因此不适合作为主键.只需在LINQ-to-SQL/EF设计器中取消标记即可.
更新:特别是,查看设计器中各种属性的"实体键"属性 - 尤其是在查询视图时.检查"实体键"是否仅对合适的列(即使行唯一的那些列)设置为true.如果设置不正确,请将其设置为false.这也可以作为黄色键图标显示 - 这应该只出现在真正是记录的唯一标识符的事物上.
归档时间: |
|
查看次数: |
6328 次 |
最近记录: |