c# - 从 LINQ to SQL 查询加载 DataGridView

标签 c# winforms linq

我在从 LINQ 查询加载数据 GridView 时遇到错误。

我正在查询以从 3 个表加载数据,但我总是收到“无法将 List 隐式转换为 IQueryable。我知道存在转换,但无法弄清楚。

所以,首先,我在我的表单中添加了一个类,它的属性是我希望连接的每一行都具有的值:

public class ListofModuleUser
{
    public string User { get; set; }
    public string Modulo { get; set; }
    public bool Read { get; set; }
    public bool Write { get; set; }
    public bool Create { get; set; }
    public bool Delete { get; set; }
    public bool Navigate { get; set; }
}

其次,我正在进行查询并希望返回一个列表以填充我的数据 GridView :

public IQueryable<ListofModuleUser> LoadData()
{
    var ctx = new JEntities();
    var fillusers = (from mu in ctx.tblModuloUsers.AsQueryable()
                     join u in ctx.tblUsers on mu.UserID equals u.UserID
                     join m in ctx.tblModuloes on mu.ModuloID equals m.ModuloID
                     select new
                     {
                         User = u.Username,
                         Modulo = m.Moduloname,
                         Read = mu.CanRead,
                         Write = mu.CanWrite,
                         Create = mu.CanCreate,
                         Delete = mu.CanDelete,
                         Navigate = mu.CanNavigate
                     }).ToList();

    return fillusers; //---> Obviously the error occours here! 
}

然后,在 Load 事件中,我获取我的列表并填充我的数据 GridView :

private void MapUserToModulos_List_Load(object sender, EventArgs e)
{
     usersmodules_datagrid.DataSource = LoadData();
}

谁能帮我弄清楚我必须使用哪个 Cast,因为我已经尝试了所有可能的转换(ToList、Array、AsEnumerable、AsQueryable...)

最佳答案

您的方法声称返回一个 IQueryable<T> :

public IQueryable<ListofModuleUser> LoadData()

但是您正试图返回 List<T> :

var fillusers = ....ToList();
return fillusers;

如果要返回一个列表,改变方法的返回类型:

public IList<ListofModuleUser> LoadData()

或者,如果你想返回一个 IQueryable , 删除 .ToList()来自您的 LINQ 查询。


另外,你的返回类型是一个特定的类:

ListofModuleUser

但是你正在查询一个匿名对象:

select new
{
    User = u.Username,
    Modulo = m.Moduloname,
    Read = mu.CanRead,
    Write = mu.CanWrite,
    Create = mu.CanCreate,
    Delete = mu.CanDelete,
    Navigate = mu.CanNavigate
}

您必须查询到正确的类型:

select new ListofModuleUser
{
    User = u.Username,
    Modulo = m.Moduloname,
    Read = mu.CanRead,
    Write = mu.CanWrite,
    Create = mu.CanCreate,
    Delete = mu.CanDelete,
    Navigate = mu.CanNavigate
}

旁注:ListofModuleUser对于单个对象来说是一个非常不直观的名称。您正在创建的基本上称为“模块用户列表列表”。也许这个类应该叫ModuleUser

关于c# - 从 LINQ to SQL 查询加载 DataGridView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50657768/

相关文章:

.net - 如何检查是否安装了 .NET Framework

c# - 将同一个表中的 2 个查询合并为一个 linq 查询

c# - 包含关键字的 Linq 不同记录

c# - 在 Controller (ASP.NET MVC 3)中作为流下载的文件会自动处理吗?

c# - 如何使用 XAML、WP 8.1 中的 DataTrigger 行为切换两个按钮的可见性?

c# - C# 中的一个接口(interface)和两个实现类(代理)

linq - 微软动态 2011 N :N LINQ query with where clause containing Guid

c# - 如何使用 SQL Server 数据库部署 Windows 应用程序?

mysql - xtragrid devexpress 中的主详细信息 View

c# - 导出 .xlsxm 文件