- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在尝试从以下查询中获取计数时遇到问题:
var usersView = PopulateUsersView(); //usersView is an IQueryable object
var foo = usersView.Where(fields => fields.ConferenceRole.ToLower().Contains("role"));
其中 UsersView 是一个类,它由一个名为 users 的 EF 实体填充(请参阅上面代码中的第一行)
这是 UsersView 类的类定义:
public class UsersView
{
public int UserId { get; set; }
public string Title { get; set; }
public string Name { get; set; }
public string Surname { get; set; }
public string Street1 { get; set; }
public string Street2 { get; set; }
public string City { get; set; }
public string PostCode { get; set; }
public string CountryName { get; set; }
public string WorkPlaceName { get; set; }
public string Gender { get; set; }
public string EMail { get; set; }
public string Company { get; set; }
public string RoleName { get; set; }
public string ConferenceRole { get; set; }
}
正如我所说,尝试执行 foo.Count() 行返回 Null 异常,这可能是因为 ConferenceRole 列在数据库中允许 Null。
现在我无法理解的是,当我直接在 ObjectQuery 上调用相同的查询时,返回的记录计数(即调用 foo2.Count())没有任何异常。
var foo2 = entities.users.Where(fields => fields.ConferenceRole.ToLower().Contains("role"));
是否可以使用 IQueryable usersView 对象代替上面的相同查询?
(对我来说关键是使用usersView对象而不是直接查询entities.users实体)
编辑
下面是 PopulateUsersView 方法的代码
private IQueryable<UsersView> PopulateUsersView()
{
using (EBCPRegEntities entities = new EBCPRegEntities())
{
var users = entities.users.ToList();
List<UsersView> userViews = new List<UsersView>();
foreach (user u in users)
{
userViews.Add(new UsersView()
{
UserId = u.UserId,
Title = u.Title,
Name = u.Name,
Surname = u.Surname,
Street1 = u.Street1,
Street2 = u.Street2,
City = u.City,
PostCode = u.Post_Code,
CountryName = u.country.Name,
WorkPlaceName = u.workplace.Name,
Gender = u.Gender,
EMail = u.E_Mail,
Company = u.Company,
RoleName = u.roles.FirstOrDefault().Name,
ConferenceRole = u.ConferenceRole
});
}
return userViews.AsQueryable();
}
}
谢谢
更新...
谢谢你们,我终于找到了 IQueryable 和 ObjectQuery 对象之间区别的一个很好的答案。
作为解决方案,我正在检查 ConferenceRole 是否为 null,然后使用 contains 方法检查,正如你们许多人所说的那样。
最佳答案
我的 猜测 是您的 PopulateUsersView()
方法实际上正在执行查询并返回 IQueryable Linq-to-Objects 对象 - 而 foo2
行只在 SQL 层执行查询。如果是这种情况,显然 PopulateUsersView()
将是执行 Count
要调试这个:
PopulateUsersView()
的代码吗?更新
@Ryan - 感谢您将代码发布到 PopulateUsersView
看起来我的猜测是正确的 - 您正在执行一个查询,将整个表返回到一个 List
- 然后您使用 Linq2Objects 进一步查询它的这个列表。
@ntziolis 为您的问题提供了一种解决方案 - 在执行 ToLower()
之前测试 null。但是,如果您的唯一要求是Count
非空项目列表,那么我建议您考虑更改PopulateUsersView
方法或更改整体设计。如果您只需要一个 Count
,那么确保数据库完成这项工作而不是 C# 代码会更有效率。如果表格有很多行,情况尤其如此 - 例如您绝对不希望将 1000 行数据从数据库中拉回到内存中。
更新 2
请考虑对此进行优化,而不仅仅是做一个简单的 != null
修复。
查看您的代码,有几行会导致多个 sql 调用:
CountryName = u.country.Name
WorkPlaceName = u.workplace.Name
RoleName = u.roles.FirstOrDefault().Name
因为这些是在 foreach 循环中调用的,所以要计算大约 500 个用户的数量,那么您可能会进行大约 1501 次 SQL 调用(尽管一些角色和国家可能会被缓存),返回可能是 1 MB 的数据总共?所有这些只是为了计算一个整数Count
?
关于c# - IQueryable 在调用 Count c# 时返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6690142/
var page = pagesRepository.GetPages(); var categoryPages = page.ChildCategoryPages; var articlePages
是否可以将 IQueryable 对象转换为 IQueryable,其中 T 是映射实体? (T 将是 POCO 类)。 提前致谢。 最佳答案 就 Cast() 它。假设它是相同类型的可查询。否则你可
我只是想知道为什么会有一个 IQueryable没有通用功能的版本? 最佳答案 The generic IQueryable is the one you use most often in meth
我有一个 IQueryable它是根据一些输入参数(排序和过滤器)创建的。 可以应用这个 IQueryable到 DbSet我有DbContext ? 例如: // create the query
我们正在尝试转换 IQueryable 的实例到 IQueryable , SpecificEntityObject类型仅在运行时已知。 我们已尝试使用下面的代码,该代码无法编译,因为类型或命名空间
最近几天我在互联网上搜索了解决方案,但没有找到我想要的。基本上,这是我的问题: 我有一个需要实现的接口(interface),它有一个返回 IQueryable 的方法(我无权访问该接口(interf
与IEnumerable相同对比IEnumerable .这是疏忽吗?或者当您没有指定类型来实现像 .Count() 这样的扩展时,是否存在问题? , .Where()等不可能? 最佳答案 来自doc
这是 Automapper 专业人员的问题。我已经尝试做查询映射好几天了——但没有成功。似乎 Automapper 不打算按照我想要的方式使用它。但也许我错了。那么问题来了…… 我有这样的类(clas
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭去年。 Improve th
我有一个类Something实现 ISomething .如何从 IQueryable 转换/转换到 IQueryable .当我尝试转换时,我能够编译,但转换的结果始终为 NULL。 背景:我这样做
我了解协方差,并且我知道一般来说在 v4.0 之前它在 C# 中是不可能的。 但是我想知道一个具体案例。有什么方法可以进行转换IQueryable至IQueryable通过以某种方式创建一个包装类,该
如果IQueryable接口(interface)在服务器中执行查询表达式,而不是像 IEnumerable 那样获取所有记录,为什么是IQueryable未被 IEnumerable 取代哪里可以更
这个问题在这里已经有了答案: Why covariance and contravariance do not support value type (4 个答案) 关闭 7 年前。 为什么编译器不
我想做这样的事情 public IQueryable GetPaged(IQueryable query, int startIndex, int pageSize) {
我正在开发一个使用新 Web API 的项目,我注意到有人从 Get 方法返回了一个 IQueryable。 我的理解是 IQueryable 可用于提高性能(延迟执行),但我认为 HTTP 连接另一
我正在重构我的 EF 存储库类以使其可测试,遵循这篇优秀博客文章中的建议: https://blog.iannelson.uk/testing-linq-queries/ 一切都很好,我也能够像在博客
我有一个包含 IQueryable 的通用函数其中每一行都包含一个具有一组属性的类的实例。 我有另一个类 (MyClass),它具有与上面的类 T 相同的一些属性...即相同的名称和数据类型。 我还有
我正在尝试使用 Automapper 将 IQueryable 映射到 IQueryable 以生成 Linq。我正在开发一个带有 Entity Framework 和 oracle 11g 的 We
我有一个对象是: IQueryable 我想将它传递给一个函数,该函数需要: IQueryable Foo 确实实现了 IFoo 为什么不能编译?什么是最好的转换方式来让这项工作发挥作用? 最佳答案
我有一个查询可以获取一些过滤后的数据,但它给了我一些奇怪的结果。使用 VS Code 调试器查看附件图像(var source 是一个 Queryable,类似于 _dbContext.ModelNa
我是一名优秀的程序员,十分优秀!