使用LINQ to Entities进行数据绑定时重复行

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)

更多:

  1. LINQ发送到SQL Server的查询有效.
  2. 在返回LINQ查询结果之前对其进行迭代会导致相同的重复.
  3. 在绑定之前迭代LINQ结果调用方法会导致相同的重复.

更新:基于下面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.这也可以作为黄色键图标显示 - 这应该只出现在真正是记录的唯一标识符的事物上.